From 54ea656f69ae3aff21fcf5ee7fbe3a6dff0778b8 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 23 Apr 2020 10:25:57 +0000 Subject: [PATCH] Refs #1003. Upgraded the ST HAL and USB libraries in the Nucleo-F746ZG demo programs because these include a fix for a problem in the HAL USB driver that had to previously be fixed manually by Feaser. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@776 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../Boot/bin/openblt_stm32f746.elf | Bin 461316 -> 465680 bytes .../Boot/bin/openblt_stm32f746.srec | 2713 +++-- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_pcd.h | 48 +- .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_ll_usart.h | 285 +- .../Inc/stm32f7xx_ll_usb.h | 45 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_pcd.c | 151 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_ll_gpio.c | 21 +- .../Src/stm32f7xx_ll_rcc.c | 7 +- .../Src/stm32f7xx_ll_usart.c | 48 +- .../Src/stm32f7xx_ll_usb.c | 155 +- .../Core/Inc/usbd_core.h | 79 +- .../Core/Inc/usbd_ctlreq.h | 18 +- .../Core/Inc/usbd_def.h | 181 +- .../Core/Inc/usbd_ioreq.h | 31 +- .../Core/Src/usbd_core.c | 329 +- .../Core/Src/usbd_ctlreq.c | 552 +- .../Core/Src/usbd_ioreq.c | 46 +- .../Boot/lib/system_stm32f7xx.c | 522 +- .../Boot/usbd_conf.c | 4 +- .../Boot/usbd_conf.h | 5 +- .../Boot/usbd_desc.c | 9 +- .../Prog/bin/demoprog_stm32f746.elf | Bin 191444 -> 192768 bytes .../Prog/bin/demoprog_stm32f746.srec | 909 +- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_hal_uart.h | 151 +- .../Inc/stm32f7xx_hal_uart_ex.h | 162 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_hal_uart.c | 345 +- .../Src/stm32f7xx_hal_uart_ex.c | 193 +- .../Prog/lib/system_stm32f7xx.c | 522 +- .../Boot/bin/openblt_stm32f746.out | Bin 619576 -> 623132 bytes .../Boot/bin/openblt_stm32f746.srec | 3071 ++--- .../Boot/ide/stm32f746.dep | 5524 ++++----- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_pcd.h | 48 +- .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_ll_usart.h | 285 +- .../Inc/stm32f7xx_ll_usb.h | 45 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_pcd.c | 151 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_ll_gpio.c | 21 +- .../Src/stm32f7xx_ll_rcc.c | 7 +- .../Src/stm32f7xx_ll_usart.c | 48 +- .../Src/stm32f7xx_ll_usb.c | 155 +- .../Core/Inc/usbd_core.h | 79 +- .../Core/Inc/usbd_ctlreq.h | 18 +- .../Core/Inc/usbd_def.h | 181 +- .../Core/Inc/usbd_ioreq.h | 31 +- .../Core/Src/usbd_core.c | 329 +- .../Core/Src/usbd_ctlreq.c | 552 +- .../Core/Src/usbd_ioreq.c | 46 +- .../Boot/lib/system_stm32f7xx.c | 522 +- .../Boot/usbd_conf.c | 4 +- .../Boot/usbd_conf.h | 5 +- .../Boot/usbd_desc.c | 9 +- .../Prog/bin/demoprog_stm32f746.out | Bin 197656 -> 197968 bytes .../Prog/bin/demoprog_stm32f746.srec | 908 +- .../Prog/ide/stm32f746.dep | 4002 +++--- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_hal_uart.h | 151 +- .../Inc/stm32f7xx_hal_uart_ex.h | 162 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_hal_uart.c | 345 +- .../Src/stm32f7xx_hal_uart_ex.c | 193 +- .../Prog/lib/system_stm32f7xx.c | 522 +- .../Boot/bin/openblt_stm32f746.axf | Bin 2530484 -> 2574116 bytes .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_pcd.h | 48 +- .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_ll_usart.h | 285 +- .../Inc/stm32f7xx_ll_usb.h | 45 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_pcd.c | 151 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_ll_gpio.c | 21 +- .../Src/stm32f7xx_ll_rcc.c | 7 +- .../Src/stm32f7xx_ll_usart.c | 48 +- .../Src/stm32f7xx_ll_usb.c | 155 +- .../Core/Inc/usbd_core.h | 79 +- .../Core/Inc/usbd_ctlreq.h | 18 +- .../Core/Inc/usbd_def.h | 181 +- .../Core/Inc/usbd_ioreq.h | 31 +- .../Core/Src/usbd_core.c | 329 +- .../Core/Src/usbd_ctlreq.c | 552 +- .../Core/Src/usbd_ioreq.c | 46 +- .../Boot/lib/system_stm32f7xx.c | 522 +- .../Boot/usbd_conf.c | 4 +- .../Boot/usbd_conf.h | 5 +- .../Boot/usbd_desc.c | 9 +- .../Prog/bin/demoprog_stm32f746.axf | Bin 1625876 -> 1650656 bytes .../Prog/bin/demoprog_stm32f746.srec | 719 +- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_hal_uart.h | 151 +- .../Inc/stm32f7xx_hal_uart_ex.h | 162 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_hal_uart.c | 345 +- .../Src/stm32f7xx_hal_uart_ex.c | 193 +- .../Prog/lib/system_stm32f7xx.c | 522 +- .../Boot/Debug/openblt_stm32f746.elf | Bin 420452 -> 423636 bytes .../Boot/Debug/openblt_stm32f746.srec | 1841 +-- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_pcd.h | 48 +- .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_ll_usart.h | 285 +- .../Inc/stm32f7xx_ll_usb.h | 45 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_pcd.c | 151 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_ll_gpio.c | 21 +- .../Src/stm32f7xx_ll_rcc.c | 7 +- .../Src/stm32f7xx_ll_usart.c | 48 +- .../Src/stm32f7xx_ll_usb.c | 155 +- .../Core/Inc/usbd_core.h | 79 +- .../Core/Inc/usbd_ctlreq.h | 18 +- .../Core/Inc/usbd_def.h | 181 +- .../Core/Inc/usbd_ioreq.h | 31 +- .../Core/Src/usbd_core.c | 329 +- .../Core/Src/usbd_ctlreq.c | 552 +- .../Core/Src/usbd_ioreq.c | 46 +- .../Boot/lib/system_stm32f7xx.c | 522 +- .../Boot/usbd_conf.c | 4 +- .../Boot/usbd_conf.h | 5 +- .../Boot/usbd_desc.c | 9 +- .../Prog/Debug/demoprog_stm32f746.elf | Bin 174256 -> 175324 bytes .../Prog/Debug/demoprog_stm32f746.srec | 706 +- .../Device/ST/STM32F7xx/Include/stm32f746xx.h | 10170 ++++++++-------- .../Device/ST/STM32F7xx/Include/stm32f7xx.h | 40 +- .../Inc/Legacy/stm32_hal_legacy.h | 369 +- .../Inc/stm32f7xx_hal_exti.h | 161 +- .../Inc/stm32f7xx_hal_gpio.h | 2 +- .../Inc/stm32f7xx_hal_i2c_ex.h | 3 + .../Inc/stm32f7xx_hal_tim.h | 354 +- .../Inc/stm32f7xx_hal_tim_ex.h | 50 +- .../Inc/stm32f7xx_hal_uart.h | 151 +- .../Inc/stm32f7xx_hal_uart_ex.h | 162 +- .../STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c | 16 +- .../Src/stm32f7xx_hal_can.c | 2 +- .../Src/stm32f7xx_hal_exti.c | 236 +- .../Src/stm32f7xx_hal_gpio.c | 65 +- .../Src/stm32f7xx_hal_i2c.c | 45 +- .../Src/stm32f7xx_hal_rcc.c | 183 +- .../Src/stm32f7xx_hal_tim.c | 147 +- .../Src/stm32f7xx_hal_tim_ex.c | 63 +- .../Src/stm32f7xx_hal_uart.c | 345 +- .../Src/stm32f7xx_hal_uart_ex.c | 193 +- .../Prog/lib/system_stm32f7xx.c | 522 +- 241 files changed, 70999 insertions(+), 60278 deletions(-) diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.elf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.elf index 9b4c9467e0e8556cde3ed0878b33c592c58c0357..a2e62627a5873f9db0fb56965e0dbe9ba7a38d36 100755 GIT binary patch literal 465680 zcmeEu3w%`7x$oM0&z?-)Lnc5-0?Z?kKp^A+8s#<2!~v2Z3fl5&nGn#4f`o@QC@mvs zi;vbvvY6-T-_#6$k4v>&Z0yFpjt-U7?9;ZFM=iYnn z{VjCQUeE9Q)_;9#t#5s6?QFif(j!R{i~W;X9;4V~g_$Pdy>oaRV+N*9VpgUgZx|cO z^O^Q*LJ?E?0>Fvq?^7nFm^DVF(aku`3KWwO0%+sjA-!8SU!)7AAx{C zKp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m z1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5 zKtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7; z2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;Yn zfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB z2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9 zfq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx z5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C z0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM z5cofgfNGtrFw;F3dCnIkR)*3kyxMc|da-ii{U75K!|}fYCv%fp>8LB&XQ;3=8fL$6 zn)xM%qt@K~m4R7_&)wHClc`Cm$ZAyPC_LZPOz9!yQ(kRT@-@kGZ_oO**%)9s(xe;0 zhAG=;J>%+biN7Wu>4wlRq8H}XHk%fJE*`V~mcd`1%|hx+wX=x+TA7)cL-J&LGCV9a z>ZQ`Agvx}uE3$rSP6!xI`rXnL^~6?HnhJhbZlA@*cegZuQR*~=?mWN_r0aA+=>R}O*Qsb$MW*jacy>|Ai;I0$-{^5;{ycZz!`V{tVy`=F^G3Tq zi85>R7ooe96I&!H=jHG=zoAEt91U-qDNiVCPf0oy-uCj#Vbj`ATaJbw7;;U!WH=Ol zVCG+fa_2MaUjf~t!D!dZ(Rrb0;RnGyVD$vB`Y=2xz-&reQpJ*m?rRN2iL;X`Tp10n zGe;B4MU0lWB$23Pk{7P|UewClR468hI(!b7!En*fWI`h}i@>C74lnwu;h*?utm zsC{eIp{fKAsE4v6%xZ2nAxDd+BW}7#+~7dHV&=&7jPNKSNiU@iN{yVOy38ThWj0DB zAMB9|yMq~?+F7QiifvLp3z(V@hJRWd?K&3i4kp$qwH0;l+WYI?taG=^4!1vXWBEo3 zZS~*3@l75&xv9NrbB|(~E%x9;b z_kZ|>5;BY~dG^^KHn2c=Z*i6{`J_=|o3_tt-^RwV&@O*7YOs73dfeaO$~%zh0R^k% zv7(o2qss2WW@VFmUm*Na@s68OlWm^`$!gnzl=8uVls^TJ>`}+fKlb4la!4_c9Ct+- zaa-bZG{*S7790zjJEQNS?%v`Z19JB9ocieRdCms|a(=;cz90Q9&&jIkr}nQrXJho2 zJZH&(oJV-hs_0IQ&w!kJc+RqDJ%2BWJ{VLsmGHJLxkYQ+2A*?GbPIB{R%husacK2Q zo;xGDp1-F=*WgV!T^_wTNbkAB#Tw_$-zGOJs7R?6@0w@omvAOVrpV@tE93xrxzI%oMetm+ZN>uApK>tu)qr zj3~+ZLjp>EZh-I%NAfC0)LAjcclIck6?$r$DfO=r<+5<_uEv>O7P`O3=&?3xl71BV zE0=U+|Ft5AElUi+1ZZ6l@K(xXZJ z`=IRbLmuK%)k89G0ImI;!7c2J>Pb`N{Ip|lZIeMqavbsoFm@6f z6@+9vJDDU!yM}{8wCmPLFY4VA2@j|je=IiQ7)B_KxlzcEb}fu_q7=qn$g5cMjR9xA zA>eL|c2#0LD{WlwecNZ5nk(w!^KH;>C6u0R&9KI+R&#Q+%Z*YYP%&V(`wH*8=$H7t z7qQRq{wdxc;cY^xzu^56;;nd(Lj1j8ZIkLr^29jDfwLNLfO9G^qkeo$Z*j&k$3`hX z_1Jqf27NY9o@e_kqvw-tEdN9c%lon=54gW{?z14}M7u)g*kvE;;dX>up^?PrzHKp1 zra;Rc;XXuQdWRdgZ5X%l|eDm%+x9 zekJ382bja%mXn60*V1LVs^p?#7g-z%2+OaP!g}BX8jFJiN}n`KR5}=(zlV*>`9KP#D$0qi%667lwmZC{Xu*qYTme!y z%kqgWay?PsFuu$%$v-w7xN7)HjwvrPhXdTS9(d|3v*v+EKc%e?u>9jKTJBfK9idC} zIl>l_CPw|F*+A6)$nh@iF*m|y@g4~h^*`!$-bS77&zZIB^Mj4BQ9Q#u2DGu^tW@Y^ zh5o!+#c@lm?6B9l8r!dzCN0iBvWMB8yM%Y=4Og9#KKt1x9rx|zeSA(&*AV(X>aN46KcuKD(^OfLoY_V68ak4OidbxEIz&! z>sjPbN+Ni|BEq^&b2&TpTrTx);aLgXA1&S+-d%h+yuJ9*@N;QWXtW~brvw)7xeD`H zYCsD4C6ecpZlz6|Z;zZS#e7UNqbbs@uNGHCIv}gTQ}jCv@Ojj(jFSRnaRkCkhXlf2 z+rzG;V^L?%%$L@1w1>Oan z4}4jTk8kj|O4?hIh&@>vAtSPwpnj{34!4%##LPPiW?TwAk&X z`8yEaU+ie47BBHJ+xA&b2k|2gL%OBQei~j;<;*=C_Fk9oVRlV^wfmX7bC)w~ZL_oi zzq4qL@rR!*HgFw`r5N(5Hz@Z>FJHWT>GI5~?5f38ORE~H zo~V*Te~nn70D4bg(CwwPkl8%=~Y%`I(rp$`-HATHWBf;n>Tb9honm zc-inYlgs9>YH+cmnOJ|~Jn~5;VP1Pf!q7IO9{Pl3Wj)EJl|8#^$|hF-;+~K9I6ZRc z8{N;ZDk*z@#VxBxmEF2B{zREY=`>gGsM)b+!PRL;sZImCs_eSemer5D5{^_fF3CK6 z;;?id(!R0kC$7NJQJy~psnm8BS9aCvJ0Vl*F+(WTAUSq9kA)}A&S_T+uj8%ZBJaj7 znGA?=m0DeaZahnThOVAz~Sbv_UNJ!$WV zs2=Y=hPIX#k`3BiQhl?OZwgp_a%f4?Gf+GhrMc(;>?z0v4ib$)-BxBk<0^JyCbXuoy1{3wk;V=QTruZI zuImHS_Pu)IRjjU#vZG;hG0R^X_;L@mhxTr@&1oT1YJ6YU z(?Zr%IbgLnc-s-qOAWTWp4FS7v zL5&iUl?50fa;Ori=G37`t*>!}%u0RLdts~J6iSVM{j}RHW50QiA3N00&-_%v%}Y?d z!fta1o9GPv(oeCmi1`sa$zyi#Ja}r^U6hke<<=ww-V2*bEg>n@8Crc8m!N}HYZ4?v z0=9-EAh{^@(Qroz*@a8*l5BT}J1h?0lGTS!Z&eP5!zF~u1n8|C`Z^4r%bcOPoX;1C zF~pwdv5&%LXo)klpT~|<$^s)khwWeqF#0hOP&ym8_Uo|?6q zt~mQr@V&61)De=DSMer|9PH z`+4t=KIie?=Ra3FneSNGP)KxM$J=b98Mmg_ioWw$=AGGGMDiXDv$6ILmUakl3cFx= zP#Aexi0A8h`4rak@}`m&3bKf;fLsTDRfJe zeobfFytzIWDm`nzQ^HG5kL+_N&wUsGx&?+W{j$&2lU%xJ1=ADa_NghDQA1*aBwC%}3 z<-$!vu$vr%-DIlzH};*Z{cMcK(0O))0eiBzGM4*;@VV=dC)sMB_I^^kyiRWX$S>!Q z3TQHn45<2AYx5B8P1ph4gLO9Cj5@|n_5!C@I*F)F_ZZ8h-0z2{UHd-m?$*M;YHf!{ zfcRU9zu{vxH0yab(xY^qU9XfGO4KrDzbAaoM*K(Af}=wkmq}~39jm)z1m}1^I1)0Y z#IcV;X$jRI?=h4~_PfK=;PH^He}(mqGHB)6tOuCZM%&2Sv-UDW+2OFsewfx_?5om? z?+%|Ux;uRKIt43|F|cyq@jcYG!{Aigj8)sH)kw0R3~D*wJbRM%z7i}=?8Y0ENoo&s9b0=Mr;*X74F z+}>o@XYOLzeVExjvTlb-_J-P#I%>A_P|H5|UF?K4+}hc7S@*LM9t|@Ih}{LmKIE&q zHiAx``ywd8!y;RQ*trqTZr>BG@mzwDEuXN=tcO{GN9sJgR)Svv{2j0ZiCDfc&_z}2;!0m5A#uij;ca09vZ(d+NevA0;Re|decJtrLz_ke9 zz<<9Tn1}F9{I@o64Z<4(WREGG-UXR8u8<^WR%O=M`J47iO6RpaUDng-t))A8xr!zgB-deg}E5BSXk2j@b@5W>&GvG1dNy1~sla40?Pc|Mao*X=RvNNV8M{xl;}#<{n6Q+)6ETt0idQC546 zNO5^nYF_z=>b~MF_sQezfpVWp<3_*I z>E-1IgL7*vb%4zar6wiy#C2WP9%n=( zPd2}KZ^E3Unw$>jhNP;bnzGnCBpH&bWUt$M;Pku)zZEuA@P3#oJ53eP#SSO$J6DI+ zhnkK`yzIrx`L*&~hb2GJjFpQUK#%%er&T+!OlHLgJ`1-@MwFASYlSsDl&6uEl+M%0 zLN@a>vXoMJnh9x%JdLcJ1fFI^Z{w0 zu_CT~u~$C14X1PcseI3LfXX|ho32*MEs%`4Eis)%I_)QhRxo=5{1C112v~@3hkr&w zfP4d8ft*G;^bYq6oNQIB$!(gfr&8lv;<#In_0uyUyzK% zJKQv?GUvO}_{o9M@G&OC%b1B8nYUG*y0$Rd^>0zhvwfd3J`SFDLr5N)Ir`)t^2U`# zwftWpKNXUb9b^Gk3^h%jaC0LsH8Of4Sj4^JhUn+PV$T#F{yfqalx-&l$RJf@_^3b0 zH-a}j08ja;?GJ^mg-09hK8w$ReT~Hn-vm%__!j%p(3|Ff9J&UrPsr~5X@N|iJ%pLaTm3yLe+u?6 zB!d$&>_YrXJ#Iz(6U49JaoR&!ypGLM{$xGhgm^XLC3@UI^?e`vEN**^#l4&!j9VMx zZ=u({%V~AA7VhLy6YqmT;_K#oU(v(F^Dqz7uFm3pO;0CYuj^sr^Cs34V95wWX$nq0 z^VL>2Q1Uz6%PFUJuNz)5W+!}LliDe4@7RRBfEJ#8v#XuKhG+Kj8u$Wa$;vSHkA|~d z0k^?<2=BLQUffp<8c8mSC%OLM`{B0AnycH5SI?g04o|xFN4}(Ob8E`ljb*bZD<@u6 zmU`cUZ80)%KgLCIi=*=0u%TFS9>#BC&HcX{4NB=QD=4MQiST_)3}lrb3A19-tXJ@c zW?;S<#`&eYiC@YE{2sV>Fuyl~37m_?OunKPPQe-kUH6y=(b}wx~)j^X>{LQNSg5GwahxQtrGkWD{uRZ zpn+UNj#P5pp`hX;j*EOVJN#=Gd0!23grLHb)zCITv(QWZIw!T#h*o?%eD@lQ+7(6O zmIHm=}%jcobHXqCM;4zvict4xn-+;DlEyNRa*Gf({Z_vAw0fpg)b-R`YMAjK}s)! z?|o)=t-+^-4xf(8SvoLQ_C#MSC*{w2c>m1owOWn+GkJ}Hv9c!+qy7JWTUyHTwQKju zzM~k^R^=#W<+K4U`P6j1cUKTP##bmy)z=(hZM+upwHEWFH#Sd}HYr^9Zfl`ATk%aT z&vaJ!-ax;Otx0r0i^l>>;d!!2I-K(@ZnyWAnk^JwXK`=!7Q;#$7AV5+82+0VC`5QH z{~Z^Yi12v+TM#HfxDdVOYE!H%WQGT5dLSQ~IW6#9&7Mv+Z%lxlSir~&?%&gf78SH5 zq1@SUd$17iaQO4!LA?L1`{Ure4reV3?d$#vg}f}(9zI5)Ygy=p?xPfPve0wge+Vu% z$tRqg;yid|6z9RyE|%dY+T=&ao(CsId>uP*x+eNHGfPfZ#++<6o=QB|;z>tZ9p0Om zbIWdfInALoYDZUOaXX+VFp^ePZ>CRrM0z}{Ji&=~Lnh+(P*`^Hc|V<(Wt)3i(zMW; zo|aTCw5+EkxgrHCy7{U@;k$9Rw#|AR$VObpy~lm7j?MCM@8UIfjHbmmEnWj^>lWX{ ztnzO39L^A;(Npc_LYAXc?C>2rtytvpqf3uDwY;6UW22>SaSTk~-IwkvIX^wQVu?@b z@GCp^CCyH#SPXB<40(6&sZ$Gm2TyM^vtIa*!AEjSB}+J_7>%>rvG$TIET@C9v^$uo zDGt&op(MqC(|1$8p@pAGwBbGz9-K;0S(Kyl}2Q%eFh+}+~T zehf<2;8_@b8Ppz({#&qAr?wRJe-oUnQ~M@jyMsjosL_}(L$;)e>49CH{%Vcht)O)o zo~hBtLGPyMkApcny(>ZC!Jtj2Hwm$A!I1;#jnbtngmh+Ix>=wUjYPZRqw7G;iF+(V zbZWy<-xo~Qsih%S6-=GI45NcNmj;t&FXo|d1`}rAz(ezcakH=Gp}BgW$_y72SrVfk zD=XxEW@y`M zE~_(im!Ixc%+aO26VkqaLC+ADiiYKS4a?U-&5!54$N^A%IkLa6Z@vWzO?`c{5V2of zv~LPEdJ8mqJ3(t9p5>8$0lmi~kM{M=RiN<0zP_1^*!M5!8UJ(oWU?Y?|>m^ zEE1i#8|P=Yb+1pRLfyz*6rRndnP2&_A2H!a3h%=O^AzfQQrai8mFw@%-fd_faFl>4D}i%uWO5(NBD^V^Ja$L4B$YnxWuUEYs^2cpeUd0avu-u4RS>e~6Qcn`tKxeIrfNX9W0 ziDhFT`4z2~A#@o+llnqMt+_~(I}a7_EUtHrZ*?H%K#8%fcAox-UGA(~SMPGPj@HT{ zZbf`#Yc`MnCQa^Ki1_f<5j>uT{P1!@FV6N-FxB?!V2W*TFxj>zm}J`>Otk$fm|*)w zFy8iD&}930&}e%m=v*)+8l9BHoTIX$GhC^R{W&qZd0raxKhPcV{`#}XvQLIFcJvRC zgG*kFus0u$v|Ya_vX!rSTY2lYV(%g;TG-Td2(g3iLtbfYe4u6@Pzd=EE4D_uUJlbt zO(|@_A#Z0;vUUaUm1c&llEnKKyIq&c`_?+3Z?%3kJGB1qFJr!-3{I;{N5J}K8H73R z=I#z-HHqW8kc)d~Dfw~7l#@=`fIB$McAZx$=?o6pQSv+N6iVIL0m6ze-34u7mR;2j zNa<7@UV8iSCNCzNZs=q;z6&l0mnK1HlIg}&OZ<-K_c3^>X+JxnjkJU)d=`w~;n36f zM3dVjUgDQglOFncRB2Oq+O8=4`>4G!8s}k+(ijT=AW9+TD5+Xsb-F5{?a)5lEAV2c z63^@jRX71Cz7O)pH8i-)t?CIkbiiDN{Y*S=jKL>B<=TVuLJv79L}$taC?sBrLLpH| z?4yv_McOcZA5~A+;0`m&bYiZW>Nhav4Dho(qoM|k`56b~e5Hj>lBw@fdH>b!O{^=g zlg3#CfpB)70`Iq!v)AcrH@FTW&Q7?^=Ae4VU=CB0i4eUYgf^}-aEC*f4 z2R&G~pfH;#>~TJ_$By*A`eW(r^ed`A=RV&nIEj0s&eeXG%hkShfx|7&;rcY<&q2(m z=0aVb9N4683!SR4ao2tj2v1#@P$!2{Whn=Dpikwt%aCts9?2YEM?UNaoc4ADPV2L0 zqfV9s_8|7Xkc-cm8l|yp+^7pEJ+cS1u;Vui_KlHtNI!zt#&aRTiRiTgA6nDr#m`~9#udG@6J0O+*ZrEHie(q%K#m$Ql zUUYQ_!`&SouF2KYrEx_uRM83pm%IWy`Bu=Kq~U0gY)?58Kz~x+AA&^J&}m+ASCoUOSy;ob1l6dMlVvli7&6LtYN2kHwobi1UNg zV|NAL^s#XbfyGtZgN%iv(P&&-?cOKDNzN7fl#-vA_PR_**a^8r>GUtSE^Jsb5}wiy z?7vCBLQPwDYY2|z?ZE8>$hJwB?N0ulTf-(eLkIl1H9zvjB#KEX;jZ@Y{cl3sS?CSF z)=L}(=!t^cC6zTB`mnqS)GmglS5KG5mB+B0Qx-CmK?~-*jlT5-2+{X1is)M$QR=CA z{nTsb4h+{k=$lq1O>64y>YP0#4Quk^ApUsCxsuhSAY)ll~*e&vQ-&f8?9YTXClIvYKJkj#<;)msO2H zpZs!K|b!ju_+GBv^1Xh z*utu!kF8lT&Fw3BrC#z%l)RGGAC$cEOMG)c^Jhwo@)Ul!Ok+2Fq z!lkqlax8z?2P_A7wkp7-g67b^a3}-wxt<<6SVm!Ktb+ZM#t;6)e4>D!aDdm8Q_wTI zzcc8pBcz?H!K-R@cK8c3s`L{I_~6ZZ=QK)V9RYbP-4SxGQ`)fKTgPydFts9^pRHt9 zji?#o9)Vw5C@hVjbB^|d@Kk7LcsL^~&gAqodFJ7)>?6{3(8kUb9>S@C+NKoviAMGL z_9I<^UdglYci20Wl)#FT@`nXh`gZx2`z&S8yGFO#?j#M^!~Oh`uHW{WxtISAc=;ty z-9BmZmqF{DxQ(jkKL=VSUIM=7D%LjHtLSF|wav1P#!&3Mp>VIk=e>FCK4-h^+=<(u zw8kcTcHPWQSe(pJGwOa<{1MoIk^#58=lIx(Ax^qMcPdEb)sr)L`fTsV@J248yQH&Z z_`W3D!SGoN-Ph|-8fq~1mp4=`S}m6+xEHTPPajZlOocZ~b0qrN?Alq^wCvTrR zN1c7H%hatPU7jN&EO&>4n{ZC^1^hqQHB}~fY#s&aXTsW@RLVPsJX2GD{V&4(^*;`4 z^Ng~u+_JDl(N;r|N^ zt!RK>FeEp4@$P7w@9Nk&UkiI(E`CFi@)bTB8@%zlC(V@K-I6#v(v^G8)O@ooVKxgL z?0H@vldKlLN%E=r_eV{uoQ(Mogz%1MpMRKimiN`UuCKdkkD(#Z6=k7c_P}@Ab2f;3 zzwU>3S5{W9!ffWQUQxYD!8^Vldzn?V5;#^kRw;O!>PJ3D>!|&jf@mA^;&Wo+rc(L_zy}ZNkNT`<_iS;Zu z>9OR;QXcy-{DeQ@S*It`^^Gue0{50O3h`c$P@jn0glDsX%^c)7H@*|jdq^IW_%F(3 zNk68VagNmbglC5$|H?4sCH{++9?#Q>;sn$?NR;%P1fG+C8rE<%+U!@VtE5$bvsslS->#}mj4W4l1b%1WcI!F#`i3KXWpsGO;#=(S z2`{eBTxAd8#CiqZ9ez9BNXKo6YIfOMtH=F@Jc#$nTco+o^3?2{!EY66XxJpY6K3wUCUi^K3p3mdrEexMu_E2+ zknNP0-c2DbKLuf>TnkUp${yHc#(aSJm)@o(hP#qjH4SI+r5))xZW7`4o`SojMP!S6+FjduO+oJQ&AphUJ0 z(P$nZQxn2eQozBYOVz73^nOO<4QrAk@uUVdn~QhlzgChXsrSn1dN5@(%u#zWVh^>h5AT@|pk z%+1bIxkD6Su_X-K{J?(TPHhi_4;Rx-Didy?ZRR()?qim+`fx;or*BZobf(#Nhh?lx zn91Zkx(UESveCduYVr$`e~)mWGGB%9?W2wb#a}@DvjOq_i2sG-lkKs1?C1e1b;a3e z*AX2}imyTZ%>lI{h`%x*e#JR$Rfus_kiTa@{(i)t8xa34;!pE9zRwQRcSg~!cg|{a z>mT?V-(14udm8g>Z;upuFw8>V#4{(Xl{tZQr5E2=B2D6HEc9Vm%2NV~SQoYLh*^mB zny_Y=%F|#$DV;s=cAq}VtstCwU5oEN*@0|~qYOM&Jh8JpipTChP?)caeKgvgG~sR=t2thDgO;}n6`Mvbny32nm~@ta;_rGziwalVH8`}B@PWV}g-+cB0I_QA;~ zRLV;aD7#@%_NH)-Pln^niO4zC{aG-9ulAH; zM9P=lp9Iwk8B$RSPK`os-DH2}KwjdBu^x)z%TT)0k&G{B2($P=65b0M6YwkNCkE(@ zu(bINeEs?hd=*Id?D1`M&)0e=6v4eXE`J;^ufngV25_e#;Dq+gz(d+-!bAN2kuoIH zo!tug^Bfr-eD{hLEv~JdwE{9L6%qUK+KjcbeOI^)G%1b#&H&-bad&)DD>;6OTe#+C z$}?6(Q6Bcs+C_DX);6p?zBY56aX?-0!nl8z`ijNzvT@}NE2#Wpl#atKi#V%kKzTF9 zsDYPr`5IP8dJa24yi83+p!F+GtF*~f8HFtHqO4uH7H1XFoohc^o4ao1x;QQ!eJezD zN}=x$MpG)K+}v6!Z^lhj+{Q$Wg{VR2S#9`T5j}W1&T2*NpRF_T`Ye<{-$3g$RLp(O z=*@Kxxl&sbDxX?q9f?1paE|ERT(@hLrEJ%VTk50|LZ!6X4jGq5ao0$%OY^2ZT3xr@ zHKeu5moWF)70c`LQ2*1jQO60~uzeo&pI?FRUQ2$~SAS|>{V=|u9qwT{*NnQdacEeY zl3n)co@kdfQsn6jPW4LGFkb^SEIuAN)3v8oPt##SYk)nnx+M2-@b5WdmQJJUi`--?_H();(&Zmn-;`r>%)Z$t_k z)d7@ET#6S_Un|E#W6mmr^0oAPflDPu8vfz}AE6B^wuaqS(&C0%(ryg{{51@$I{ZwB zMh?eCMtLe5i{l)(E}HKMOfFA@ha$h_jVY7!7x3?|o%83pW?gWyKM4o;B)o_z97!P98}wsTajJ2e_sw#{}t;2zJbDb@$e|r(T%bh z`S=X1>z?Q+tWcx4wvFKH#8*M$HiAl(44a)%7VWw#3Tr5DXiIuUW}Q@gWKU)-PE_j} zT-f>LycaajDa083ut!@{XhqGheG~n-Fp7EHx1wY_{4=(RZD|dM}b+;WVb4a4Gd+ z=^#6iq$s@xcVqAAh|)W17%OOR8Qt@v)A@dB%8orRcKX+Re5AB?TbLb`tgt4n2HH*B z#SR>uyWH&K7(K9?zIrYw{9$+kp7Di=&nKUpASa(JkmhytV7=HAWqFeWBP&N$IJ}st zZ(n))&u*74`~3FY@2vdJ&%B>`pF}-rN|wP<^(1N|q*hlogI+aGHP3a`^%@_Gd(8CX z$}?@~bNR7(XWG`I*Byp>^|AOLr_ip8_j)3}em~dsle0;?Ynz*F2K3mrUefckz=rO& zIU%dLY1?k+sgJNpU)$FRFS*ERf{cc0YYJatnw?^mm_P1#Yh54%ZdI^o83 z5nq3kJoFb4@V9o_q)DIdF^(S!ExM}LaH0%i#g`vl_`K^B{FP<$!%QttD4WmyQD3&o zI6KX_gSAC*1Ly&?1^b25`2J*{;)BO1;0znGu!~#A@EyBE`yu^~5NSmma4GF!IXL5< zw0V5`vFW~D%y>dEO)2{p{Lkll#?fEA@W}96ZtN-D_lw%`PFK)S8G^pT&w3!w zgg)>yQ;t#7QzO2|9qt+F`7pe}FSVOYitk0-=Zy=L_}o_~wv_lj&76d9M~1e|#Av-g z3L7QwWXov83K4IP8WI1hg*k?`4aZt&z#~mdMIUYNDH-`m=8K(d^QohzPPUdxKZDYF zjfRn52Fc3dn(M$C6p2P_o4$|Hl7hBN_1jz{j!C&+HO3W;KK7SJnpb3piru`S{#@6N z?!B&L^iWNY@~HHz{PRfH`{%6tsORA2%>5M4xvru)hA;6c9|eC^CiJkCtisx+BoEmxha*Ohm-9FP z9vKIs1rps)z+XHeq`rf{07SItt_StThyb^g%NO___9d3J;2BbrSauzrhw&V#v6L-w z!MpIB!A6oig1^*5mNK8!d4Iot7c)T$Uo!RsnPn8RlqK=K0sUr{VV=`}EoBKvIZm@7 zq~#Q#D+W9!JV|)Wc+&A?;32xECi2U1ooRs;%|r1mnjISlY3`0_I&&sSvVE7wLIKG^ zHZ*!K+WQ7aTDPWN$h zFSV!4huuTZ&RM~rKN=lPdt>?=6$a0OQ9r@oVjvrh^b&Wlx{E#Z_b3>PuTV~ANX%Z` z*suYXHtx`?<+S!TY*dkpLH z;td&I=}J@CLhtrXny)(w%&5G!w~+F(k1c2RvKBT3^Tpy#S(_SMBLXQ1ANLKdUAzf@ zA8W&LpHzI@yTsSvN@+Efn>^Pol*?MYbhB_?N84JOIZuRfo@|9@#M%)gdD{4VBYChF ztJ8L-?7+?eJV()dr5tBiS<04dI?<>}kP5C1zO=e=#P_Pj8ydj3;XJ+%gRc?Z{*#>V z3*qD7tKD$Cknih!ulFhVa_>T(k+|aPFPw0cE!;$Vec7f!`Umj6qJ|^MO}78cXlA9; z=FN_FT@Sc2<~nUYgs+L_)jD9~Wd)*nBLbF6X1C0-dV0G)K9|Pd!y^*zgt*R8T5jZB z?9|V8je|Y%^YHG@o;51|62Uz-8kg6H+i=IJ#~bZ>EZh+!Tu8>eM6?8Zv2A!r4s(+c zcd>~^CRVE6uD9?#RHVzoeJfN}vr%S@HF6teHmnUJX3^BPeYRxqu!m0vo3YNo_Cx43 zn+c(eFj*~R$;82u84)H+W<2Vh4*U%oM?5u}bhDiJF6E2l(m3$;^5s-rac9Ukgj;x|A6;y{LMed92l$%W@K+3A@&&!jJh}6gz2aaz*A1 zG}HdfWoo5edK|BFI3neJ9rzOSpjv(xW}iscR{nRwG@Yb&kJs_9#eO@|<-xpX^AOd{ z=skN_4(Z$8wMmG7hueL>aK#-d`c^!ry%e-NfM295KLTH#2jAkN+>&T*GqrkXyh6OIG>$X+5Sm)fjVdc6TtEyL`%)Hu_ zx4J5?x8AUR7+iR%M>Z+Ps3#u8rZT<2U%c|GhdLtrwJyuXKQTu50gk>Ch@RLLBAHp`4#@jCOpi*!v=&6Oyyw{4;y(niHGA5 z{yXxa>C_6wuEXCc{Hw%FZ{Xo1#E(EgARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5 zKtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVXAP^7; z2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB2nYlO0s;Yn zfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9fq+0jARrJB z2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx5C{ka1Ofs9 zfq+0jARrJB2nYlO0s;YnfIvVXAP^7;2m}NI0s(=5KtLcM5D*9m1Ox&C0fB%(Kp-Fx z5C{ka1Ofs9fq+0jARrJB2nYlO0s;YnfIvVX@ZS=FuViMuUSZb#c>Y@o2%#ihu#}Q_ zo}ZMq`tz^;U1f>?U4<2L2?YK>LtttO=7yXOJ`T-jTjv$bB$YB#Bc31P*@)*IJSXv_ zNlZo&=d~k$;bpQUD;T^6CEk#!TpE-))0n9UPs>zhij~@j@F6@u8<0kMKh)!o;~g(s znIy4;#qkElC#YXxRN1dN?B62WS44DMq%UeD@(m8$>0M{d@7RI`VCd{kSIw%g zT3Wkq%}wj7zE`~Trdw~@ux8Eoik6lZ7Z#OHK%i>f>It{5xpn0PLSbpmt<|e;Td{KK z>Z)pA&8;i{sk-YouKzprAotRns;kfAU0P6FP!yBk?@+j?)Qs?O&s{KQ!NfUQI|ig^ z=m0JaG0zosb%RQA94U3#?3tCz%GTA~zH%KE;3WQIkf{{AZT<2U%W8o6+Jb5t6U$bt zys_%GRU4LV*jT%AeSwdZZq=IVTM$Br_N5}ce!~isMLP6#-O81>ZqSP$y(Shx7>z@Q z%2+j+EUR991!6|j-nf3l%GEKggUS&%|Q%CZ*Lyb2|1-yi0v~Zo}wRckOzv;E@ybx6{R0ox! z@t{O6j(F@s9uy?C%Z?^D?q|FN=M z_E-D3CxD(bkq=T!3JucL|NI~&)&2WgCWbN%?tgkHYh$2#!>YbfI$%(s?=Bd#7@hi< z#n|i{vk3Q%S&YZnn580pV^%ApjaiJ+0b`a%=Y?Yy1N8hcd)_F8d;{hfKA&i#_A5Rn z;-K3WOS+n5OjQ#wM6If7w5ui>!m81xLRV=pI!O7gTxI!~jZocxF~-IdX|&O*N+qZ> zk`H$k!#|Pqys*DgngNv#(_jL>biC7uwB5o7+7K;lkkw4((>qZnoeM=H&t`#i6tL^> zLZf7m)KukR{1O2RuhsSs)_QDEtv~-mwam)ns3qC@8*>#k<|7?}iRm;+PzxsV*+QzY z0(J>CFgspDCC|zlRuy^^rlEByXw-02BBT}bPgFC-3)Cd*R1UqO{1_C}3|_-zRpX4) z)l?KoC;$&Fm^>B1iIiHPN=i}z5qkf71!^*i@fvnD4Z+L;HN{#00ya)SF)9zCLY&g^ zJ?ka%??=9>^dO%|#ToD66^9k53082llc-bCTIDV@I$qhj**Z;Cl(P&)m3uc^FHyLY zQQ-%*!XaMxu}c>Ik{8~g754 zdEo)5xl1-a{5T%0lcTv9KbtWE1=w74ng9LN{W?NQH|Hq&@UXI@p(qbbV`?r zG@XVoG=~;-BZ3OJktQo#VW*W(<5H`}MHbK$1iOzn8qurD2@3DqS)08{jF(b zp)OjXvB2mgilm$q^@hyjZ5yU|Ig{K1P9woMM$HC|WExIIyhI#Uc#Z6IJsxW@k>!I6 zR4a6<%Ib1;I2U4?UdyJ}((oFle1pcMGQB{PNAECon9{ttKsLmBEkp>tjY*Zj;Ik}s z8ntu?l2qytCH_XDOu>oJo^`<3s0`&f>#Zux9%{lgo%yse6Olc%e|jp21B1WyG3Y~k zW^6W5jg$3>x`fj(5oJ3!*;F6{HKJLFsAiBbH(N=FH2g}&^nNxs5}Tj*tphq6YBVVr zx?EBcxw3r6s@jke4~bETc;%i)>H#8!fv!QK&5jDmpiEdeQ5|MfuBAa#Xf-O|u&NG} z$}dnyYm1bkjK@@Kv`}GW(mWbxe2Q0EM{_}n)#%`{TPc=?Sgg;q&77F$fQ%VM!_P;A_QWl=Vv4ZCzh53>Y;ptZrKwP7jsw=#zMl1sa+fOmMD@!Na| z@Y%Ic9fN8U3si^IN(x=bizMk|x&Q@v3T4eSqQo%8$F*W)0b=MeK&3aKzn^X_liNMGL z-j!%Ml`cRjd%2o2RhrStlL@VfsEQtnM-QQWS!7pC<&w!pCDqDhlR<^c z##_2~GnIauU0S+{x^(4Sx~sT!9zMcn43KU*hcOY85VeKc)CU?`_S?-S5HNlVpB#8^D6m0t zAPt6K%8kez(=XdZT{cvg7pjSzU6ESA-{?SkqZ8>xpxF7e3jUZSH0TylC!PfgiOSuC zf>%?(ap1HN6$-hSk3-C4C5V0-!{ZP0_}4M9b9Ax6MOp|Qa&v3b($6p%J*BT^$x}In zQ{Wh<{0M3_OgZ&E>wq!+Tmpv9DKwUw$+Ub)*))jb%Ps0q#4vFxP(7M-xT&fIuo4@M zW;Fr(S(>9XJ4`pI`7ojtjTT_C&uE@S95$R?V|)N+y}~yA^V>qP;rn0O@cm=EYJFQs z&XE5HT{nX^g?)QQZI3&^x6?-Ie;kIdVj0SfH%Kv^^d73L%5Ld(?yOn%=PIQKnD6&v)5_KQl$Jp=vDyq{8yU+6U^ zrW>cCV>Lh8bTt>eu!W?)CWBjn)qr)GTe%1=Qef6f+Vs)LBFVpBYzJvQlbvkeg1%US0`Rn!?8knU3^%anCL?YAX*fYBgvhm$OH9s66D>6 z+lG8UF-;#l{2rykyS2i)#0t8C3PCTjd25Ci^l#~(qw+6v!;l)=SLO1U)xA;k@L)5@ z9S?=Z0g}B&mER*~YJCC*M?M?O z1)K_7h7*m89Y6gu$29-ThfB1o|Cb;0T3& z&Uf`1G3oQQU^n!#`?1Uf|tdr*!ZBwd>V)8PIDX0ps|OYOo3G`$6k?k zs+aR|TwI{SNy5w8_!K!DMaUHvpLJf90yznOli2`7Vb5Gbq54nf2A;$H-#W(p-=t}S z4(I+)sTmz^=tqWw_-m(#1Cy3Pr#Gymlf*u~ z+4+BtBAUEpHRds!L}h}ywS)zUZ=}mrh#f**GZgmjm)9o;SLFt>uy6gDV|~8DAC{ zXSC&m;XHIKL|1SCfZ~u`sVx}FWhb)?i!j+|h1_XL9!k`Kb7`QAA6|slc52$!F>8pd zEE=^o&2U#?$&!5q<42*D7#;=Mo=e!Kj-WSo`SgN3MFafHyu0pIfJZtX+|r`{g^K4r zuH{jqF38)3JlVoKvd{I&EByi)1`9_5C!vG$ng-Ww~S*&a{^(xhyvM4zd%Lt*fpc zI42*ZN#e5<&77O2W z!x;l6KaHm5A2uyi}{2!?4iOHSnGeL@XbETP#R91^DVZ%H3X zMSFitvn3g}!~0jFM=7IMKXI6-yEhc$wds7;rFQq3-U{}}{BQ$PF_}(Wgz5S|q?jKd z!FVZ9jqgJqO>$~D6_u1?l2_RUFEF_e5X>mR^smkR)KTQaaoYv)k$U}!^v2;Hy*N#vh(pK0;uP`|#eQ

J$&HHo`i6+j#74Vn$n8?>R) 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 literal 461316 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Ð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 D8W=kJ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec index 3657589b..f2744acd 100755 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/bin/openblt_stm32f746.srec @@ -2,7 +2,7 @@ S01D000062696E2F6F70656E626C745F73746D3332663734362E737265638C S31508000000000005203503000885030008850300085D S315080000108503000885030008850300080000000022 S315080000200000000000000000000000008503000832 -S31508000030850300080000000085030008A94500089C +S315080000308503000800000000850300086D460008D7 S315080000408503000885030008850300088503000862 S315080000508503000885030008850300088503000852 S315080000608503000885030008850300088503000842 @@ -30,18 +30,18 @@ S315080001B085030008850300088503000885030008F1 S30D080001C0850300088503000809 S315080001C810B5054C237833B9044B13B10448AFF37B S315080001D800800123237010BDEC04002000000000F5 -S315080001E8C050000808B5034B1BB103490348AFF3D1 -S315080001F8008008BD00000000F0040020C050000878 +S315080001E88451000808B5034B1BB103490348AFF30C +S315080001F8008008BD00000000F004002084510008B3 S3150800020870B50D4E0D4D761BB61006D00024013478 S3150800021855F8043B9847A642F9D1094E094D761B6D -S3150800022804F04AFFB61006D00024013455F8043BFA -S315080002389847A642F9D170BD4452000844520008AE -S315080002484C52000844520008024B13B1024800F009 +S3150800022804F0ACFFB61006D00024013455F8043B98 +S315080002389847A642F9D170BD085300080853000824 +S315080002481053000808530008024B13B1024800F07F S3150800025805B870470000000071020008002301462F S315080002681A46184600F01EB838B50A4C0A4D641BDB S31508000278A4100AD004F18043013B05EB8305013C31 S3150800028855F804399847002CF9D1BDE8384004F0E8 -S3150800029819BF00BF505200084C520008704700BFEB +S315080002987BBF00BF1453000810530008704700BFFF S315080002A8704700BF2DE9F0411E4C05462068904668 S315080002B81F460E46FFF7F2FF1B4B1A68D2F848315D S315080002C833B35A6820681F2A27DC4DB9911C0132B6 @@ -50,1351 +50,1364 @@ S315080002E803EB82010124C1F8888004FA02FED3F8D8 S315080002F88841022D44EA0E0CC3F888C1C1F8087172 S31508000308E4D1D3F88C114EEA0104C3F88C41DDE731 S3150800031802F5A673C2F84831D3E7FFF7C1FF4FF0D5 -S31508000328FF30DBE728040020D8500008DFF834D06F +S31508000328FF30DBE7280400209C510008DFF834D0AA S31508000338002103E00C4B5B58435004310B480C4B27 S3150800034842189A42F6D30B4A02E0002342F8043BC5 -S31508000358094B9A42F9D300F007FDFFF751FF03F05E -S315080003683DFB704700000520505200080000002099 -S31508000378EC040020EC0400208C140020FEE710B5DD -S3150800038813460222C0F86C22C36103620A4600219A -S3150800039803F0BAFD002010BD08B513460A46002129 -S315080003A803F0B2FD002008BD08B513460A46002129 -S315080003B803F0B2FD002008BD08B50423C0F86C3266 -S315080003C800231A46194603F09FFD002008BD08B504 -S315080003D80523C0F86C3200231A46194603F09CFD1B +S31508000358094B9A42F9D300F045FDFFF751FF03F020 +S315080003689FFB704700000520145300080000002072 +S31508000378EC040020EC040020C0140020FEE710B5A9 +S3150800038813460222C0F894228361C3610A460021F3 +S3150800039803F01CFE002010BD08B513460A460021C6 +S315080003A803F014FE002008BD08B513460A460021C6 +S315080003B803F014FE002008BD08B50423C0F89432DB +S315080003C800231A46194603F001FE002008BD08B5A1 +S315080003D80523C0F8943200231A46194603F0FEFD91 S315080003E8002008BD002302781AB10133DBB20130B8 S315080003F8F9E71846704708B54B88012B00D008BDA1 -S31508000408C0F87C32FFF7D8FFF9E70B7803704B780A -S3150800041843708B78CA7803EB022343800B794A79B1 -S3150800042803EB022383808B79CA7903EB0223C38003 -S31508000438704710B50446802103F04EFD002120467A -S3150800044803F04AFD10BD30B583B005460C464A8808 -S31508000458130A013B062B00F28480DFE803F0041632 -S315080004682A8282667300D0F888321B680DF1060165 -S31508000478007C9847BDF8062012B1E388002B74D192 -S31508000488E388002B7BD003B030BD037C43B9D0F892 -S315080004988C329B6A0DF10600984702234370E9E7F8 -S315080004A8D0F88C32DB6A0DF10600984702234370B0 -S315080004B8E0E7D2B2052A34D8DFE802F0030B131BAB -S315080004C8232BD0F888325B680DF10601007C984723 -S315080004D8D0E7D0F888329B680DF10601007C98476A -S315080004E8C8E7D0F88832DB680DF10601007C984722 -S315080004F8C0E7D0F888321B690DF10601007C9847D9 -S31508000508B8E7D0F888325B690DF10601007C984790 -S31508000518B0E7D0F888329B690DF10601007C984748 -S31508000528A8E72146FFF785FFADE7037C33B9D0F87E -S315080005388C325B6B0DF1060098479BE72146FFF75F -S3150800054878FFA0E7037C43B9D0F88C321B6B0DF112 -S3150800055806009847072343708CE72146FFF769FF8B -S3150800056891E72146FFF765FF8DE79A4228BF1A46A5 -S31508000578ADF8062001462846FFF701FF80E728461A -S31508000588FFF71AFF7FE738B504468B88F3B9CB8897 -S31508000598E3B94B887F2B19D803F07F0590F8743296 -S315080005A8032B0CD080F87652294603F0A5FC204682 -S315080005B8FFF702FF35B1022384F8743209E0FFF722 -S315080005C838FF06E0012384F8743202E02046FFF774 -S315080005D830FF38BD38B504460D468978284B19705A -S315080005E801290ED890F87432022B0ED0032B21D08D -S315080005F82946FFF71EFF224B1978204600F070FAA5 -S3150800060802E02946FFF715FF38BD81B1416003238B -S3150800061880F8743200F057FA022803D02046FFF70C -S31508000628CBFEF1E729462046FFF703FFECE7FFF77D -S31508000638C3FEE9E789B1436899421DD0D9B200F0EB -S315080006484FFA0F4B19786160204600F03CFA0228E9 -S315080006580DD02046FFF7B0FED6E7022380F874329D -S31508000668416000F03DFA2046FFF7A6FECCE729468A -S315080006782046FFF7DEFEC7E7FFF79EFEC4E700BF82 -S315080006880805002008B5CB88012B0CD190F87432E0 -S315080006985AB29AB1022B09D9032B0FD10122011D8F -S315080006A8FFF76DFE01E0FFF7C4FE08BD014600230B -S315080006B841F8083F0122FFF762FEF6E7FFF7B9FEA1 -S315080006C8F3E708B590F87432013B022B12D8CB88A9 -S315080006D8022B0CD10123C360D0F87C320BB103235B -S315080006E8C360022200F10C01FFF749FE08BDFFF7B7 -S315080006F8A0FEFBE7FFF79DFEF8E708B590F8743209 -S31508000708013B022B09D84B88012B00D008BD0023D2 -S31508000718C0F87C32FFF750FEF8E7FFF78AFEF5E7E0 -S3150800072808B50B7803F06003202B05D0402B03D0BF -S3150800073843B1FFF77EFE03E0D0F88C329B689847F2 -S31508000748002008BD4B78092B1BD8DFE803F01117E2 -S315080007581A141A08051A0E0BFFF775FEF0E7FFF7C5 -S3150800076812FFEDE7FFF736FFEAE7FFF78BFFE7E744 -S31508000778FFF7A7FFE4E7FFF73EFEE1E7FFF7BDFF50 -S31508000788DEE7FFF756FEDBE738B505460C460B7875 -S3150800079803F06003202B06D0402B04D01BB1FFF7CB -S315080007A848FE002038BD95F87432013B022B16D84E -S315080007B82379012B0ED8D5F88C329B682146284612 -S315080007C89847E388002BECD10028EAD12846FFF79A -S315080007D8F3FDE6E721462846FFF72BFEE1E7214623 -S315080007E82846FFF726FEDCE738B504468A880B78DC -S315080007F803F06003202B08D0D0B2402B05D05BB19C -S315080008082046FFF716FE002005E0D4F88C329B68D0 -S3150800081820469847002038BD202B13D04B78012B4B -S3150800082843D05DB2002D73D0032B40F0F58094F8C1 -S315080008387432022B0CD0032B21D02046FFF7F9FD82 -S315080008480020E8E7D4F88C329B6820469847E2E708 -S31508000858B0F1800318BF0123002808BF00234BB155 -S315080008680146204603F038FB8021204603F034FB76 -S315080008780020D0E72046FFF7DCFD0020CBE74B88B1 -S315080008884BB9B0F1800318BF0123002808BF00231D -S315080008980BB1CB8823B12046FFF78EFD0020BAE7B7 -S315080008A80146204603F018FBF5E794F87432022B44 -S315080008B806D0032B1BD02046FFF7BBFD0020AAE76E -S315080008C8B0F1800318BF0123002808BF00234BB1E5 -S315080008D80146204603F000FB8021204603F0FCFA77 -S315080008E8002098E72046FFF7A4FD002093E74B88E9 -S315080008F8002B40F0968010F07F0F04D12046FFF7B2 -S315080009085BFD002087E70146204603F0EDFAF5E788 -S3150800091894F87432022B06D0032B2ED02046FFF704 -S3150800092888FD002077E7B0F1800318BF0123002867 -S3150800093808BF002393B912F0800F14D100F07F0086 -S3150800094800EB8000830003F5A073E11800250D600D -S3150800095802222046FFF713FD28465CE72046FFF7E4 -S3150800096868FD002057E700F07F0000EB8000830051 -S3150800097803F1100121440431E8E752B2002A23DBC7 -S3150800098800F00F0303EB83039D002544D5F8443193 -S3150800099843B3002A2BDB00F07F0202EB82029300A6 -S315080009A803F5A073E518802814BF0023012300283F -S315080009B808BF01232BB300232B60022229462046B1 -S315080009C8FFF7DDFC002026E700F00F0303EB83039F -S315080009D89D002544AB69002BDBD12046FFF729FD8E -S315080009E8002018E72046FFF724FD002013E700F04B -S315080009F87F0202EB8202930003F1100525440435B1 -S31508000A08D1E70146204603F013FA10B101232B60FB -S31508000A18D3E700232B60D0E72046FFF70AFD00201E -S31508000A28F9E60020F7E6C0B170B50D461646044645 -S31508000A38FFF7D8FC013040003080287003236B701C -S31508000A480223217841B101345A1CD2B2E95402333F -S31508000A58DBB20021A954F4E770BD704798B108B510 -S31508000A680346D0F88C0210B10020C3F88C0209B1ED -S31508000A78C3F888121846012380F87432027003F006 -S31508000A889DF9002008BD0220704710B504460123C9 -S31508000A9880F87432D0F88C325B680179984720461A -S31508000AA803F0FFF9204603F0ECF9002010BD19B150 -S31508000AB8C0F88C12002070470220704708B503F06A -S31508000AC8E8F9002008BD08B5D0F88C3233B11B68A0 -S31508000AD8984708B9002008BD0220FCE70220FAE773 -S31508000AE808B5D0F88C325B689847002008BD38B539 -S31508000AF8044600F520752846FFF787FC0123C4F845 -S31508000B086C32B4F88632C4F8703294F8801201F060 -S31508000B181F03012B0FD05AB23AB1022B10D001F09D -S31508000B288001204603F0D8F903E029462046FFF756 -S31508000B38F7FD002038BD29462046FFF725FEF8E7C9 -S31508000B4829462046FFF750FEF3E738B50446A9BB01 -S31508000B581046D4F86C32032B03D0052B25D0002079 -S31508000B6838E0D4F84C31D4F8502193420DD99B1A61 -S31508000B78C4F84C319A4206D99AB201462046FFF77C -S31508000B8813FC002026E092B2F7E7D4F88C321B69EA -S31508000B981BB194F87422032A04D02046FFF70CFCEC -S31508000BA8002017E020469847F7E70025C4F86C5256 -S31508000BB82946204603F090F928460BE00A46D0F85D -S31508000BC88C329B693BB190F87412032905D11146FA -S31508000BD89847002038BD0220FCE70220FAE710B53E -S31508000BE80446002956D11046D4F86C32022B09D08F -S31508000BF8002B18BF042B44D094F87832012B45D023 -S31508000C08002010BD236A626A93421BD8E169B1FBCA -S31508000C18F2F302FB13132BB98A4203D8D4F87032BD -S31508000C2899421DD3D4F88C32DB681BB194F8742228 -S31508000C38032A23D08021204603F04EF92046FFF7E1 -S31508000C48C6FBD9E79A1A226292B201462046FFF7EE -S31508000C58A3FB00231A461946204603F05DF9CBE79D -S31508000C68002211462046FFF797FB0021C4F87012A8 -S31508000C780B460A46204603F04FF9BDE72046984733 -S31508000C88D8E78021204603F027F9B5E7002084F83D -S31508000C987802B6E70A46D0F88C325B693BB190F819 -S31508000CA87412032905D1114698470020A9E702209E -S31508000CB8A7E70220A5E770B5044640230022114697 -S31508000CC803F0F7F80125C4F844514026C4F85061E2 -S31508000CD8334600228021204603F0EBF8A5616662B8 -S31508000CE884F874520023C4F86C326360C4F87C3202 -S31508000CF8D4F890322BB1D4F88C325B6800212046A0 -S31508000D089847002070BD01740020704790F8743227 -S31508000D1880F87532042380F874320020704790F8FA -S31508000D28753280F874320020704708B590F8743226 -S31508000D38032B01D0002008BDD0F88C32DB69002BC4 -S31508000D48F8D09847F6E7002070470020704700203B -S31508000D58704708B5012280F87422D0F88C225268A8 -S31508000D6801799047002008BD10B40F4AD2F8883098 -S31508000D7843F47003C2F888300C4B196841F0010136 -S31508000D881960002098601C680949214019600949BA -S31508000D985960196821F480211960D8604FF00063FA -S31508000DA893605DF8044B704700ED00E00038024098 -S31508000DB8FFFFF6FE1030002410B5094B4FF0FF323E -S31508000DC81A6200241C625A625C621A611C615A61C2 -S31508000DD85C619A619C6102F0AFFE204610BD00BFB7 -S31508000DE80038024010B504460E4B18784FF47A734B -S31508000DF8B3FBF0F30C4A1068B0FBF3F001F054FEAD -S31508000E0868B90F2C01D901200AE0002221464FF0C3 -S31508000E18FF3001F017FE054B1C60002000E001209A -S31508000E2810BD00BF300400202C0400203404002024 -S31508000E3808B5032001F0F4FD0020FFF7D3FF02F000 -S31508000E48D5FD002008BD000038B5044603F0A4FB0C -S31508000E580546B4F1FF3F02D0044B1B781C4403F047 -S31508000E689BFB401BA042FAD338BD00BF30040020C4 -S31508000E782DE9F04782B0D0F80080CA00521A9300CC -S31508000E8803445A6D1B6D9A4255D8C1469B1AC1EB45 -S31508000E98C104A2000244526C9A4200D31A460C4670 -S31508000EA8074602F1030A4FEA9A0A15E006F1030A09 -S31508000EB84FEA9A0AE3001B1B9D003D44A96C3B7C3C -S31508000EC80093B3B2E2B2404602F024F9AB6C33445D -S31508000ED8AB646B6D1E446E6509EB441303F510632A -S31508000EE89B699BB2534512D3E3001B1B9A003A44ED -S31508000EF8516D136D99420AD24BB15B1AC4EBC40102 -S31508000F088A003A44566C9E42D0D31E46CEE7E30082 -S31508000F181B1B980007443A6D7B6D9A420FD804F05C -S31508000F280F040123A340D8F8344824EA0304C8F870 -S31508000F383448002000E0012002B0BDE8F087002010 -S31508000F48FAE77047F0B58BB0002800F08A800446A7 -S31508000F5890F8BD33F3B1032384F8BD33206801F054 -S31508000F6891FE254655F8107B6E460FCD0FC60FCD58 -S31508000F780FC695E8030086E80300231D0ECB3846FE -S31508000F8801F0C6FD58B1022384F8BD330125284669 -S31508000F980BB0F0BD80F8BC33FFF7D3FFDBE70021C1 -S31508000FA8206801F075FE00236568AB4216D2D900A1 -S31508000FB8C81A82002244012082F83D0082F83C3093 -S31508000FC8A2F84230002082F83F0050649064CA1A9A -S31508000FD89100214408650133DBB2E5E700239D4209 -S31508000FE816D9D800C11A8A002244002182F8FD11B0 -S31508000FF882F8FC3182F8FF11C2F80412C2F8081206 -S31508001008C21A90002044C0F810120133DBB2E6E792 -S31508001018254655F8107B6E460FCD0FC60FCD0FC661 -S3150800102895E8030086E80300231D0ECB384601F031 -S3150800103875FE054660B9002384F83830012384F81C -S31508001048BD33636A012B08D0206802F018FA9EE7B8 -S31508001058022384F8BD33012599E7204602F04EFBA2 -S31508001068F2E7012593E7704790F8BC33012B0ED0B9 -S3150800107810B50446012380F8BC33006802F0F3F97A -S31508001088206801F0F9FD002084F8BC0310BD022091 -S31508001098704738B590F8BC33012B18D0044601239D -S315080010A880F8BC33006801F0EDFD206802F0A7F966 -S315080010B8054628B1002384F8BC330125284638BDDF -S315080010C8206802F0DCF9002384F8BC33F6E7022529 -S315080010D8F4E768B110B50446032380F8BD33FFF773 -S315080010E8D8FF2046FFF7BFFF002084F8BD0310BDD0 -S315080010F80120704770B505460E460368196C03EB60 -S31508001108461303F53064A3680269012A09D0354AEB -S31508001118914261D113F4004F54D04FF40043A360B1 -S315080011285DE013F0080F14D02F4A914205D913F43D -S31508001138004F02D04FF40043A360284602F0BAFDD8 -S3150800114805F571720121286802F0F6F90823A360EB -S3150800115845E013F0200F02D02023A3603FE013F0E8 -S31508001168280F3CD1204A914206D913F4004F03D0E0 -S315080011784FF40043A36032E0F200921B93002B441D -S31508001188D3F804222169C1F31201521AC3F81422AA -S31508001198D3F80412D3F808220A44C3F80822F1B28D -S315080011A8284602F08FFDD6B9C6EBC606B3002B440F -S315080011B8D3F810329BB905F571720121286802F037 -S315080011C8BBF90CE013F0200F01D02023A360F1B27D -S315080011D8284602F077FD02E0F1B202F073FD00201E -S315080011E870BD00BF0A31544F0A30544F38B504460B -S315080011F803681D6C03EB411101F530618A680369C0 -S31508001208012B0DD0124B9D4214D0204602F052FDF8 -S31508001218104B9D4202D92369012B12D0002038BDF4 -S315080012280C4B9D42F1D912F4004FEED04FF400430F -S315080012388B60EAE712F4004FE7D04FF400438B605F -S31508001248E3E704F571720121206802F075F9E5E70C -S315080012580A31544F0A30544F2DE9F84F04460568A9 -S31508001268284602F049F908B1BDE8F88FA8460746A6 -S31508001278206802F010F90028F6D0206802F00BF969 -S3150800128810F0020F04D02268536903F00203536171 -S31508001298206802F000F910F4002F40F092803E46CC -S315080012A8206802F0F8F810F4802F40F0DC802068F7 -S315080012B802F0F1F80028C0F24A81206802F0EBF83B -S315080012C810F4006F0AD0D5F8083813F0010F40F06B -S315080012D858812268536903F400635361206802F051 -S315080012E8DAF810F0006F15D02268536903F0006326 -S315080012F8536194F8F433002B40F04781012184F8B0 -S31508001308F41323685B6DC3F38303C4F8F8332046E4 -S3150800131802F008FA206802F0BEF810F4805F40F080 -S315080013283881206802F0B7F810F4005F40F08A8127 -S31508001338206802F0B0F810F0100F14D022689369EC -S3150800134823F0100393612F6A07F00F08C7F3434386 -S31508001358022B00F08F81062B00F0AD812268936975 -S3150800136843F010039361206802F095F810F0080F0F -S3150800137840F0B581206802F08EF810F4801F40F01E -S31508001388B781206802F087F810F4001F40F0BA8188 -S31508001398206802F080F810F0804F40F0BD81206880 -S315080013A802F079F810F0040F3FF45EAF23685D6821 -S315080013B815F0040F40F0B981226853682B4353602F -S315080013C852E7206802F06BF881463E4624E008EBAF -S315080013D846130122C3F8082B31462046FFF78AFE32 -S315080013E829E031462046FFF701FF08EB4613082295 -S315080013F8C3F8082B22E008EB46132022C3F8082B6B -S315080014081AF4005F05D008EB46134FF40052C3F8E8 -S31508001418082B01364FEA5909B9F1000F3FF440AFD6 -S3150800142819F0010FF5D0F1B2206802F048F88246A3 -S3150800143810F0010FCBD11AF0080FD2D11AF0100FFD -S3150800144804D008EB46131022C3F8082B1AF0200F0D -S31508001458D6D02369012BCED104F5717201212068F3 -S3150800146802F06AF8C7E7206802F021F881463E4686 -S315080014782EE0F200921B93002344596C9A6C0A4496 -S315080014889A6448E01AF0080F04D008EB46130822B5 -S31508001498C3F808291AF0100F04D008EB46131022CF -S315080014A8C3F808291AF0400F04D008EB461340225F -S315080014B8C3F808291AF0020F04D008EB46130222CB -S315080014C8C3F808291AF0800F3CD101364FEA5909A2 -S315080014D8B9F1000F3FF4EBAE19F0010FF5D05FFA3A -S315080014E886FB5946206801F0F3FF824610F0010F83 -S315080014F8C8D006F00F03012101FA03F2D8F83438E8 -S3150800150823EA0203C8F8343808EB4613C3F808195F -S3150800151823698B42ADD05946204602F0DFFB236982 -S31508001528012BAFD1002EADD1C6EBC60293002344DA -S315080015381B6D002BA6D104F571720121206801F0F4 -S31508001548FBFF9FE731462046FFF792FCBDE7D5F833 -S31508001558043823F00103C5F8043894F8F433012B4A -S3150800156808D0204602F000FC2268536903F00043BD -S315080015785361A2E6002184F8F413204602F0D2F853 -S31508001588F2E7204602F0D6FBA3E6204602F0D2FB95 -S31508001598C0E605F50069D9F8043023F00103C9F84F -S315080015A804301021206801F08BFB14E008EB471380 -S315080015B84FF67F31C3F80819D3F8002922F4001228 -S315080015C8C3F80029C3F8081BD3F8002B22F4001225 -S315080015D8C3F8002B01376368BB42E7D8D9F81C3033 -S315080015E843F00113C9F81C30236BEBB1D9F88430E2 -S315080015F843F00B03C9F88430D9F8443043F00B0399 -S31508001608C9F84430D5F8003823F4FE63C5F800381D -S3150800161804F57172217C206801F08EFF22685369EF -S3150800162803F4805353617CE6D9F8142042F22B035D -S315080016381343C9F81430D9F8103043F00B03C9F826 -S315080016481030DFE7206801F05BFF206801F03EFCF8 -S31508001658E060276800F06EFC227B0146384601F0F8 -S3150800166895FA204602F04CFB2268536903F40053A6 -S3150800167853615DE647F6F0731F423FF46FAE3F09C4 -S315080016884FEAC80AAAEB08034FEA8309A144C7F335 -S315080016980A02D9F80812284601F042FEC7F30A07D3 -S315080016A8D9F808323B44C9F80832D9F814321F4425 -S315080016B8C9F8147252E6082204F57171284601F031 -S315080016C82FFEC7F30A174FEAC803A3EB08018A00D7 -S315080016D82244D2F814321F44C2F814723EE6204651 -S315080016E802F007FB2268536903F00803536141E6D1 -S315080016F8F1B2204602F047FB2268536903F48013C7 -S3150800170853613EE6F1B2204602F037FB2268536978 -S3150800171803F4001353613BE6204602F03AFB2268BD -S31508001728536903F08043536139E6204602F03BFBD0 -S3150800173842E690F8BC33012B0BD010B504460123BA -S3150800174880F8BC33006801F08EFE002084F8BC03DC -S3150800175810BD0220704790F8BC33012B0BD010B58A -S315080017680446012380F8BC33006801F088FE00208F -S3150800177884F8BC0310BD0220704790F8BC33012BCF -S315080017880DD010B50446012380F8BC3380F838100C -S31508001798006801F058FE002084F8BC0310BD02203A -S315080017A87047F8B511F0800F27D101F00F05EE0044 -S315080017B8771BBC00274604F5FC7404440434074424 -S315080017C8002587F8FD5101F00F012170A260E3702A -S315080017D8627802B1E180022B1ED090F8BC33012B47 -S315080017E81DD00546012380F8BC332146006801F060 -S315080017F87DFB002085F8BC03F8BD01F00F06F5004F -S31508001808AF1BBC0027463834044404343E46064415 -S31508001818012586F83D50D6E700232371DDE7022027 -S31508001828EAE738B511F0800F20D101F00F04E2007D -S31508001838151BAB001D4603F5FC7303440433054426 -S31508001848002285F8FD2101F00F01197090F8BC23D4 -S31508001858012A1AD00446012280F8BC2319460068D2 -S3150800186801F08CFB002084F8BC0338BD01F00F0496 -S31508001878E200151BAB001D463833034404332C46D7 -S315080018880444012284F83D20DDE70220EDE770B51F -S3150800189801F00F05EE00711B8C0004F5FC74044476 -S315080018A8211D761BB4000444C4F80822C4F8103273 -S315080018B80023C4F8143284F8FD3184F8FC5103690E -S315080018C8012B06D065B9DAB2006801F09FFB002043 -S315080018D870BDC5EBC506B4000444C4F80C22F1E78C -S315080018E8DAB2006801F02AFCF1E701F00F01C1EB52 -S315080018F8C1018B001844D0F81402704770B501F07E -S315080019080F05EE00711B8C0038340444211D761B24 -S31508001918B4000444A264236500236365012384F89C -S315080019283D3084F83C500369012B06D05DB9DAB21C -S31508001938006801F06BFB002070BDC5EBC506B40056 -S315080019480444E264F2E7DAB2006801F0F7FBF2E76A -S3150800195838B501F00F0543689D4236D811F0800F57 -S3150800196820D1CA00541AA3001C4603F5FC73034485 -S31508001978043322460244002182F8FD1101229A7096 -S315080019881D7090F8BC23012A21D00446012280F84C -S31508001998BC231946006801F0D7FC7DB1002084F8FD -S315080019A8BC0338BDEA00511B8B001946383303447B -S315080019B804330144012281F83D20DFE704F57172FA -S315080019C8217C206801F0B8FDE8E70120E9E7022054 -S315080019D8E7E710B501F00F0443689C422CD811F0CC -S315080019E8800F1DD1E3001A1B91000A4601F5FC7108 -S315080019F8014404310244002382F8FD3100238B7028 -S31508001A080C7090F8BC33012B18D00446012380F8D3 -S31508001A18BC33006801F0C5FC002084F8BC0310BD7F -S31508001A28E3001A1B91000A4638310144043102447E -S31508001A38012382F83D30E1E70120F0E70220EEE7CE -S31508001A48534B98421FD0534B984228D0524B984232 -S31508001A5831D0524B98423AD0514B984243D0514BC9 -S31508001A6898424CD0504B984255D0504B98425ED02D -S31508001A784F4B984267D04F4B984270D04E4B98427E -S31508001A8879D00120704703F560531A6942F00102BC -S31508001A981A611A6922F001021A610020704703F5D3 -S31508001AA850531A6942F002021A611A6922F00202B0 -S31508001AB81A610020704703F540531A6942F0040278 -S31508001AC81A611A6922F004021A610020704703F5A0 -S31508001AD830531A6942F008021A611A6922F0080294 -S31508001AE81A610020704703F520531A6942F010025C -S31508001AF81A611A6922F010021A610020704703F564 -S31508001B0810531A6942F020021A611A6922F0200253 -S31508001B181A610020704703F500531A6942F040021B -S31508001B281A611A6922F040021A610020704703F503 -S31508001B38E0531A6942F080021A611A6922F0800293 -S31508001B481A610020704703F5C0531A6942F4807277 -S31508001B581A611A6922F480721A610020704703F51F -S31508001B68A0531A6942F400721A611A6922F40072BB -S31508001B781A610020704703F580531A6942F4806297 -S31508001B881A611A6922F480621A610020704700BF38 -S31508001B98000002400004024000080240000C02400F -S31508001BA8001002400014024000180240001C0240BF -S31508001BB8002002400024024000280240F0B40C68C5 -S31508001BC894FAA4F4B4FA84F42CE08E68826893FA3A -S31508001BD8A3F5B5FA85F56D0007FA05F522EA0502B3 -S31508001BE893FAA3F5B5FA85F56D0006FA05F52A43BD -S31508001BF882600E69C26893FAA3F5B5FA85F56D0091 -S31508001C08032707FA05F522EA050293FAA3F5B5FAB2 -S31508001C1885F56D0006FA05F52A43C2604A68022A60 -S31508001C2822D001340B6833FA04F250D00122A240BC -S31508001C381340F6D04E68026893FAA3F5B5FA85F507 -S31508001C486D00032707FA05F522EA050293FAA3F5B4 -S31508001C58B5FA85F56D0006FA05F52A4302604A685D -S31508001C68013A012AC5D8B0E793FAA3F2B2FA82F282 -S31508001C78072A15D84D69026A93FAA3F6B6FA86F6BC -S31508001C88B6000F2707FA06F622EA060293FAA3F31E -S31508001C98B3FA83F39B0005FA03F313430362C0E719 -S31508001CA84A69456A1B0A93FAA3F6B6FA86F6B6008F -S31508001CB80F2707FA06F625EA060593FAA3F3B3FAF1 -S31508001CC883F39B0002FA03F32B434362A9E74A68A6 -S31508001CD8013A012A02D90020F0BC7047C96842684F -S31508001CE822EA030201FB03F313434360F3E7000008 -S31508001CF810B40A490C6924F440740C610C6944F45C -S31508001D0840740C610C6944F001040C61026043607C -S31508001D18BFF34F8F5DF8044B704700BF003C024085 -S31508001D28084B1A6922F440721A611A6942F4007259 -S31508001D381A611A6942F001021A610160BFF34F8FEE -S31508001D48704700BF003C0240084B1A6922F44072EB -S31508001D581A611A6942F480721A611A6942F0010214 -S31508001D681A610180BFF34F8F704700BF003C0240DD -S31508001D78074B1A6922F440721A611A691A611A69B4 -S31508001D8842F001021A610170BFF34F8F704700BF16 -S31508001D98003C02401A4BDB6813F0020F04D0194ABC -S31508001DA8936943F020039361154BDB6813F0100F12 -S31508001DB804D0144A936943F010039361104BDB6807 -S31508001DC813F0200F04D00F4A936943F00803936170 -S31508001DD80B4BDB6813F0400F04D00A4A936943F0AB -S31508001DE804039361064BDB6813F0800F04D0054A99 -S31508001DF8936943F002039361014BF222DA60704754 -S31508001E08003C02402C0E0020094B1B69002B01DB05 -S31508001E1800207047064B074A5A6002F188325A6012 -S31508001E281B69002B01DB002070470120704700BFA3 -S31508001E38003C024023016745034A136943F00043FF -S31508001E4813610020704700BF003C024038B50446BD -S31508001E58154B00229A6102F09FFB0546134BDB6877 -S31508001E6813F4803F0AD0B4F1FF3FF7D024B102F04B -S31508001E7893FB401BA042F1D903200DE00B4BDB680E -S31508001E8813F0F20F09D1094BDB6813F0010F08D0DC -S31508001E98064B0122DA60002038BDFFF77BFF0120D8 -S31508001EA8FAE70020F8E700BF2C0E0020003C0240A5 -S31508001EB8F8B51E4C247D012C35D01F4616460D460E -S31508001EC804461A4B01221A754CF25030FFF7BEFF2A -S31508001ED8014698B9032C07D8DFE804F002151A1F3B -S31508001EE8F1B22846FFF744FF4CF25030FFF7AEFF31 -S31508001EF801460F4A136923F0010313610B4B0022AD -S31508001F081A750846F8BDB1B22846FFF71DFFEBE774 -S31508001F1831462846FFF704FFE6E732463B46284699 -S31508001F28FFF7E6FEE0E70221EBE700BF2C0E0020EC -S31508001F38003C0240014B1868704700BF2C0400207B -S31508001F487047002800F0A18038B5044690F820307C -S31508001F58D3B12268136823F00203136002F01CFB4E -S31508001F68054623685A6812F0020F10D002F014FBCF -S31508001F78401B0A28F5D9636A43F4003363620523CC -S31508001F8884F82030012038BDFFF7DAFFE1E71A6840 -S31508001F9842F001021A6002F0FFFA054623685A68F9 -S31508001FA812F0010F0DD102F0F7FA401B0A28F5D9ED -S31508001FB8636A43F400336362052384F820300120FA -S31508001FC8E1E7227E012A3DD01A6822F080021A60CB -S31508001FD8637E012B3BD02268136823F04003136005 -S31508001FE8A37E012B39D02268136823F020031360D7 -S31508001FF8E37E012B37D02268136843F01003136079 -S31508002008237F012B35D02268136823F00803136051 -S31508002018637F012B33D02268136823F00403136007 -S31508002028A368E26813432269134362691343626823 -S31508002038013A21681343CB6100206062012384F8C2 -S315080020482030A0E71A6842F080021A60C0E72268C2 -S31508002058136843F040031360C2E72268136843F025 -S3150800206820031360C4E72268136823F0100313607B -S31508002078C6E72268136843F008031360C8E72268AE -S31508002088136843F004031360CAE701207047000089 -S3150800209890F82030013BDBB2012B05D9436A43F49B -S315080020A8802343620120704770B4434BD3F800225B -S315080020B842F00102C3F80022D3F8002222F47C5227 -S315080020C8C3F80022D3F80022486A42EA0022C3F875 -S315080020D800224A6902F01F02012000FA02F2D3F828 -S315080020E81C42D0430440C3F81C42CB69B3B9324BEF -S315080020F8D3F80C420440C3F80C42CE688D884C6964 -S3150800210845EA0645483443F834508E680C884D69C4 -S3150800211844EA0644483503EBC5035C60CB69012BE2 -S315080021281DD08B69002B32D1234CD4F804320340D6 -S31508002138C4F804320B698BBB1F4BD3F814422040F2 -S31508002148C3F814020B6A012B2FD01B4AD2F80032A7 -S3150800215823F00103C2F80032002070BC7047164B02 -S31508002168D3F80C421443C3F80C420E688D884C69A0 -S3150800217845EA0645483443F834508E688C894D69D3 -S3150800218844EA0644483503EBC5035C60C9E70A4CCC -S31508002198D4F804321343C4F80432CBE70648D0F817 -S315080021A814321343C0F81432CCE70349D1F81C3269 -S315080021B81A43C1F81C22C8E70064004038B590F8ED -S315080021C82030DBB2012B05D0436A43F4002343626F -S315080021D8012038BD0446022380F8203002681368B7 -S315080021E823F00103136002F0D7F9054623685B68F4 -S315080021F813F0010F0DD002F0CFF9401B0A28F5D9C4 -S31508002208636A43F400336362052384F820300120A7 -S31508002218DFE700206062DCE770B490F820400568C4 -S31508002228AD68013CE4B2012C65D815F0E05F5CD0D6 -S31508002238C5F30165022D05D9436A43F400034362D1 -S3150800224801205DE00124AC401C608B68002B39D165 -S315080022580E68CB68046843EA465605F118031B015D -S31508002268E65003680C6905F1180603EB06135C606B -S315080022780B7D012B31D0D17993791B0443EA01638D -S31508002288517943EA01231479016823432C0121442F -S31508002298C1F88C31D17893781B0443EA01635178E5 -S315080022A843EA0123117802680B432244C2F88831AD -S315080022B8016805F118031B01CA5842F00102CA5001 -S315080022C800201DE04C6843EAC403CC68066823432B -S315080022D805F1180424013351C3E7036803EB061311 -S315080022E8596841F480715960C5E7436A43F4001395 -S315080022F84362012004E0436A43F4802343620120D1 -S3150800230870BC704790F82030013BDBB2012B01D92D -S315080023180020704703689B68890631EA030301D0E1 -S31508002328012070470020704730B490F82040013CDF -S31508002338E4B2012C00F28A8051B90468E46814F002 -S31508002348030F10D1436A43F400134362012082E065 -S315080023580468246914F0030F05D1436A43F400138B -S315080023684362012077E0056801F11B0424012C5912 -S3150800237804F004049460002C5AD1056801F11B0482 -S3150800238824012C59640D1460056801F11B04240105 -S315080023982D59C5F34005D560056825446D6805F0CF -S315080023A80F051561056825446D68C5F30725956108 -S315080023B805682C446468240C546104680A011444AA -S315080023C8D4F8B8411C7004681444D4F8B841C4F366 -S315080023D807245C7004681444D4F8B841C4F3074465 -S315080023E89C7004681444D4F8B841240EDC70046858 -S315080023F81444D4F8BC411C7104681444D4F8BC418C -S31508002408C4F307245C7104681444D4F8BC41C4F3C3 -S3150800241807449C7104682244D2F8BC21120EDA716A -S3150800242871B90268D36843F02003D360002012E02C -S31508002438056801F11B0424012C59E4085460A3E734 -S315080024480268136943F020031361EFE7436A43F40C -S3150800245880234362012030BC70470000014B186096 -S31508002468704700BF2C04002038B5036813F0010F25 -S3150800247875D10D46044603683C4A1A404B68C96834 -S315080024880B4329690B43A9690B4313430360AB68DC -S31508002498426822F44052134343606B69826822F407 -S315080024A8407213438360324B984216D0314B984298 -S315080024B827D0314B984228D0304B984229D0304BF8 -S315080024C898422AD02F4B98422CD02F4B98422ED080 -S315080024D82E4B984230D0012042E0032000F008F93C -S315080024E800283ED02B68002B3DD0AA69B2F5004FCC -S315080024F827D000EB5300B0FBF3F080B2E060002071 -S315080025082EE00C2000F0F4F8EAE7302000F0F0F8A6 -S31508002518E6E7C02000F0B6F9E2E74FF4407000F0AD -S31508002528B1F9DDE74FF4406000F0E2F8D8E74FF478 -S31508002538405000F0A7F9D3E74FF4404000F0A2F95D -S31508002548CEE75A0802EB4000B0FBF3F04FF6F073FB -S315080025580340C0F342001843E060002000E0012071 -S3150800256838BD0120FCE70120FAE700BFF369FFEF51 -S31508002578001001400044004000480040004C00405C -S31508002588005000400014014000780040007C0040DC -S315080025981E4A136843F0010313601C4B1B6813F0AB -S315080025A8020FFAD0194A00239360194B136013686F -S315080025B823F0F80343F080031360144B1B6813F0E9 -S315080025C8007FFAD1114B1B6813F0006FFAD10F4B35 -S315080025D81B6813F0005FFAD10C4B0E4A5A60103A82 -S315080025E8C3F88420C3F88820DA6822F4FE42DA6041 -S315080025F8DA6842F47F02DA605A6F22F001025A67F3 -S315080026085A6F42F080725A670020704700380240B5 -S31508002618FFFFF2EA10300024034B9B68C3F3031349 -S31508002628024AD35CD840704700380240DC5000089C -S31508002638034B9B68C3F38223024AD35CD84070478E -S3150800264800380240EC500008034B9B68C3F342333A -S31508002658024AD35CD840704700380240EC5000085C -S315080026680D4B5B6803F480039BB90C480A4B5A6800 -S3150800267802F03F02B0FBF2F25868C0F3881000FB7C -S3150800268802F05B68C3F3014301335B00B0FBF3F068 -S3150800269870470348EAE700BF003802400024F40000 -S315080026A800127A0008B5074B9B6803F00C03042B45 -S315080026B804D0082B04D1FFF7D3FF02E0024800E054 -S315080026C8024808BD0038024000127A000024F400C7 -S315080026D810B50446FFF7E6FF2060FFF79DFF606028 -S315080026E8FFF7A6FFA0606068FFF7AEFFE06010BDC1 -S315080026F808B5032808D00C282DD0B0F5406F51D05E -S31508002708302877D0002008BD584BD3F890300340BE -S3150800271843EA0040564B98420FD0B0F1031F13D036 -S31508002728013B984206D0FFF7BDFFFFF775FFFFF795 -S315080027388BFFE8E7FFF7B6FFE5E74C4B1B6813F096 -S31508002748020F7ED10020DEE7484B1B6F13F0020FFD -S3150800275879D10020D7E7454BD3F89030034043EAB0 -S315080027680040444B98420FD0B0F10C1F13D0043BDD -S31508002778984206D0FFF796FFFFF74EFFFFF758FF78 -S31508002788C1E7FFF78FFFBEE7384B1B6813F0020F48 -S315080027985CD10020B7E7354B1B6F13F0020F57D1F2 -S315080027A80020B0E7314BD3F89030034043EA0040A5 -S315080027B8314B984210D0B0F10C2F14D0A3F5806392 -S315080027C8984206D0FFF76EFFFFF726FFFFF73CFF94 -S315080027D899E7FFF767FF96E7244B1B6813F0020F84 -S315080027E839D100208FE7214B1B6F13F0020F34D124 -S315080027F8002088E71D4BD3F89030034043EA004091 -S315080028081E4B98420FD0B0F1301F13D0103B984298 -S3150800281806D0FFF747FFFFF7FFFEFFF709FF72E746 -S31508002828FFF740FF6FE7114B1B6813F0020F17D12C -S31508002838002068E70D4B1B6F13F0020F12D100201A -S3150800284861E70F485FE74FF400405CE70C485AE732 -S315080028584FF4004057E70A4855E74FF4004052E757 -S31508002868074850E74FF400404DE700BF00380240DC -S315080028780200030008000C000008000C20003000C5 -S315080028880024F40008B5C0280AD0B0F5407F2FD038 -S31508002898B0F5405F54D0B0F5404F79D0002008BD58 -S315080028A8594BD3F89030034043EA0040574B9842B7 -S315080028B80FD0B0F1C01F14D0403B984206D0FFF79E -S315080028C8F1FEFFF7A9FEFFF7B3FEE8E7FFF7EAFE12 -S315080028D8E5E74D4B1B6813F0020F40F08180002096 -S315080028E8DDE7494B1B6F13F0020F7BD10020D6E7B3 -S315080028F8454BD3F89030034043EA0040444B98428E -S3150800290810D0B0F1032F14D0A3F58073984206D0DF -S31508002918FFF7C8FEFFF780FEFFF78AFEBFE7FFF757 -S31508002928C1FEBCE7384B1B6813F0020F5DD10020C7 -S31508002938B5E7354B1B6F13F0020F58D10020AEE7E9 -S31508002948314BD3F89030034043EA0040314B984264 -S3150800295810D0B0F1302F14D0A3F58053984206D082 -S31508002968FFF7A0FEFFF758FEFFF762FE97E7FFF7A7 -S3150800297899FE94E7244B1B6813F0020F3AD10020FE -S315080029888DE7214B1B6F13F0020F35D1002086E720 -S315080029981D4BD3F89030034043EA00401E4B98423B -S315080029A810D0B0F1C02F14D0A3F58043984206D0B2 -S315080029B8FFF778FEFFF730FEFFF73AFE6FE7FFF7F7 -S315080029C871FE6CE7104B1B6813F0020F17D1002035 -S315080029D865E70D4B1B6F13F0020F12D100205EE757 -S315080029E80E485CE74FF4004059E70C4857E74FF4A0 -S315080029F8004054E7094852E74FF400404FE70748B4 -S31508002A084DE74FF400404AE7003802408000C0000E -S31508002A180002000300200030008000C00024F400F3 -S31508002A280649CB6823F4E0631B041B0C000200F478 -S31508002A38E0600343024A1A43CA60704700ED00E0A3 -S31508002A480000FA0530B4154BDB68C3F30223C3F15B -S31508002A580704042C28BF04241D1D062D01D9033B91 -S31508002A6800E000234FF0FF3505FA04F421EA0401D3 -S31508002A78994005FA03F322EA03031943002805DBFC -S31508002A880901C9B2064B195430BC704700F00F004B -S31508002A980901C9B2034B1954F6E700BF00ED00E077 -S31508002AA800E400E014ED00E00138B0F1807F0AD2B6 -S31508002AB8064B5860064AF02182F8231000209860D1 -S31508002AC807221A6070470120704700BF10E000E02F -S31508002AD800ED00E0002301330C4A934211D802693D -S31508002AE8002AF8DA036943F0010303610023013376 -S31508002AF8064A934207D8026912F0010FF7D1002057 -S31508002B087047032070470320704700BF400D030035 -S31508002B1884B010B5044603A880E80E00089B012B6C -S31508002B281DD1A36B23F48033A363E268164B1340C5 -S31508002B38E360E36823F44013E3600F9B012B09D095 -S31508002B482046FFF7C7FF069B012B14D0BDE81040A7 -S31508002B5804B07047E36843F48013E360F0E7E3687A -S31508002B6843F04003E3602046FFF7B4FFA36B43F442 -S31508002B788033A363E7E7A36843F00603A360A36863 -S31508002B8843F02003A360E1E7BFFFBDFF022A0AD08E -S31508002B980921C26822F47052C260C36843EA8123D5 -S31508002BA8C36000207047274B0B44274A934237D9FE -S31508002BB8264B0B44264A934234D9264B0B44264ABD -S31508002BC8934231D9254B0B4402F5C332A0329342BE -S31508002BD82CD9234B0B44234A934229D9224B0B441D -S31508002BE802F5922202F57872934223D91F4B0B44B9 -S31508002BF802F5C32202F5207293421DD91C4B0B44D9 -S31508002C0802F5B71202F55872934217D9194B0B44B5 -S31508002C1802F5122202F5F862934211D80721B8E79D -S31508002C280F21B6E70E21B4E70D21B2E70C21B0E76C -S31508002C380B21AEE70A21ACE70921AAE70821A8E78C -S31508002C480621A6E7405327FFFF340C00401E1BFF4A -S31508002C583F420F0000DC0BFF7F4F1200808CF9FE05 -S31508002C6860B6E5FE5FE3160000D3CEFEC05BB3FE92 -S31508002C7800CA91FEE05459FE836843F00103836055 -S31508002C8800207047836823F001038360002070479B -S31508002C9808B5C36823F0C043C360012909D069B9D8 -S31508002CA8C36843F08043C3603220FEF7CDF800209E -S31508002CB808BDC36843F00053C360F5E70120F7E78A -S31508002CC8890141F02001016100230133054A934235 -S31508002CD805D8026912F0200FF7D1002070470320A3 -S31508002CE8704700BF400D030010230361002301331A -S31508002CF8054A934205D8026912F0100FF7D1002049 -S31508002D0870470320704700BF400D0300D0F800380D -S31508002D181943C0F8001800207047000084B0F8B5B9 -S31508002D28044607A880E80E00254600230E2B07D878 -S31508002D3803F1400204EB8202002151600133F5E7F2 -S31508002D48119B03BBA36B23F40013A363236843F007 -S31508002D5840032360236843F0800323600023C4F8F4 -S31508002D68003E04F50066D4F80038C4F800380C9B11 -S31508002D78012B0DD0032B1CD1099BABB9002120468A -S31508002D88FFF7C4FF19E0A36B43F40013A363E5E751 -S31508002D98099B23B900212046FFF7B8FF0DE001215A -S31508002DA82046FFF7B3FF08E001212046FFF7AEFFEC -S31508002DB803E003212046FFF7A9FF10212046FFF765 -S31508002DC87FFF074600B101272046FFF78DFF00B1B0 -S31508002DD80127002333617361F3610AE0C3B94FF031 -S31508002DE80060C2F8000900220A614FF67F328A603D -S31508002DF80133079A9A4210D905EB431202F5106176 -S31508002E08D2F800090028E9DB0020C2F80009EAE739 -S31508002E184FF09040C2F80009E5E700230AE0C3B975 -S31508002E284FF00060C2F8000B00220A614FF67F32A5 -S31508002E388A600133079A9A4210D905EB431202F5BC -S31508002E483061D2F8000B0028E9DB0020C2F8000B35 -S31508002E58EAE74FF09040C2F8000BE5E7336923F438 -S31508002E68807333610A9B012B1BD00022A2616FF085 -S31508002E78804262611BB9A36943F01003A361A26982 -S31508002E880E4B1343A3610D9B1BB1A36943F00803BB -S31508002E98A361119B012B0BD03846BDE8F84004B056 -S31508002EA87047074A3263316B064A0A433263DCE7DE -S31508002EB8A269054B1343A361EEE700BF00383C80BF -S31508002EC8000180000300010004000040D0F808381B -S31508002ED813F0060307D0062B18BF022B01D00020D3 -S31508002EE870470220704700207047000070B40B78BE -S31508002EF84A78012A20D0D0F81C2803F00F060124A6 -S31508002F08B44042EA0442C0F81C2800EB4310D0F843 -S31508002F18003B13F4004F0CD1D0F8002B8B68C3F391 -S31508002F280A03C97843EA81431343134A1A43C0F884 -S31508002F38002B002070BC7047D0F81C4803F00F0619 -S31508002F48B24092B22243C0F81C2800EB4310D0F8CE -S31508002F58002912F4004FECD1D0F800498A68C2F368 -S31508002F680A02C97842EA814242EA8353234302495C -S31508002F781943C0F80019DCE70080001070B40B7814 -S31508002F884A78012A1FD0D0F83C5803F00F060124C6 -S31508002F9804FA06F625EA0645C0F83C58D0F81C583F -S31508002FA8097801F00F018C4025EA0444C0F81C484A -S31508002FB800EB4310D0F8002B124B1340C0F8003B27 -S31508002FC8002070BC7047D0F83C6803F00F0402FA7A -S31508002FD804F4A4B226EA0404C0F83C48D0F81C480D -S31508002FE8097801F00F018A4092B224EA0202C0F871 -S31508002FF81C2800EB4310D0F80039034A1A40C0F8D9 -S315080030080029DDE70078F3EF007833EC70B40B7825 -S315080030184C78012C24D000EB431000F530631D6969 -S315080030283A4C2C401C611D69394C2C401C614C6972 -S315080030380CB18C684C611C6944F400241C611C6939 -S315080030488D68C5F312052C431C61012A59D0D0F89E -S31508003058003B43F00443C0F8003B002070BC7047AF -S315080030684C6954BB00EB4314D4F81069284D354015 -S31508003078C4F81059D4F8105945F40025C4F810595D -S31508003088D4F81069214D3540C4F81059012A30D0B2 -S315080030984A694AB1D0F83428097801F00F040121A1 -S315080030A8A1400A43C0F8342800EB4310D0F8002999 -S315080030B842F00442C0F80029CFE700EB431404F5B0 -S315080030C810642669114D354025612669104D35402D -S315080030D825614E698D68AE4200D94D61256945F46A -S315080030E80025256125694E69C6F31206354325610B -S315080030F8CCE70A69002AD7D000EB4311C1F814298E -S31508003108D2E7CA68002AA2D05A61A0E70000F8FFE9 -S31508003118FFFF07E070B49DF80C4064B903339E08B6 -S31508003128B44208D200EB023303F5805351F8045B26 -S315080031381D600134F4E7002070BC7047F0B583B011 -S315080031480B784C78012C29D000EB431303F530642F -S315080031582669704D3540256126696F4D35402561CC -S315080031684D69002D40F0A88025698E68C6F31206B9 -S3150800317835432561256945F400252561012A00F0AE -S31508003188B080CA78012A00F0B280D3F8002B42F042 -S315080031980442C3F8002B002003B0F0BD4C69002C8C -S315080031A839D100EB4314D4F810695B4D3540C4F89F -S315080031B81059D4F8105945F40025C4F81059D4F80C -S315080031C81069544D3540C4F81059012A55D0CC78A1 -S315080031D8012C0BD04C694CB1D0F834480D7805F061 -S315080031E80F060125B5402C43C0F83448CC78012C85 -S315080031F84BD000EB4313D3F8004944F00444C3F812 -S315080032080049CB78012BC6D100928B8A0A78C968FF -S31508003218FFF780FFBFE700EB4314D4F810693D4D6C -S315080032283540C4F81059D4F810693B4D3540C4F8F0 -S315080032381059D4F810694D698F683D44013DB5FBAE -S31508003248F7F5364F07EAC5453543C4F81059D4F893 -S3150800325810594E69C6F312063543C4F8105904F5D1 -S315080032681064CD78012DB0D1256925F0C0452561B2 -S31508003278256945F000552561A7E70C69002CB5D0E6 -S3150800328800EB4315C5F81449B0E7D0F8084814F414 -S31508003298807F08D100EB4315D5F8004944F000545F -S315080032A8C5F80049A5E700EB4315D5F8004944F0E9 -S315080032B88054C5F800499CE78E683544013DB5FB3E -S315080032C8F6F52669154F07EAC5473E432661276975 -S315080032D88E68ADB206FB05F5C5F312053D432561B3 -S315080032E84CE7CA68002A3FF44CAF626149E7D0F850 -S315080032F8082812F4807F06D1D3F8002B42F0005232 -S31508003308C3F8002B41E7D3F8002B42F08052C3F8E4 -S31508003318002B3AE70000F8FFFFFF07E00000F81F58 -S3150800332803329208002393420CD210B400F5805455 -S31508003338246841F8044B01339342F7D308465DF8ED -S31508003348044B7047084670470B784A78012A14D008 -S3150800335800EB4310D0F8002B002A06DB2BB1D0F877 -S31508003368003B23F08043C0F8003BD0F8003B43F409 -S315080033780013C0F8003B0020704700EB4310D0F854 -S315080033880029002A06DB2BB1D0F8003923F0804340 -S31508003398C0F80039D0F8003943F40013C0F80039EA -S315080033A8E9E70B784A78012A0ED000EB4310D0F8E3 -S315080033B8003B23F40013C0F8003BCB78023BDBB292 -S315080033C8012B15D90020704700EB4310D0F80039B7 -S315080033D823F40013C0F80039CB78023BDBB2012B83 -S315080033E8F0D8D0F8003943F08053C0F80039E9E737 -S315080033F8D0F8003B43F08053C0F8003BE2E738B505 -S315080034080546044600220E2A09D804EB42134FF64D -S315080034187F31C3F80819C3F8081B0132F3E70022FD -S31508003428C5F81028C5F81428C5F81C282846FFF733 -S315080034385BFC034608B1184638BD10212846FFF735 -S315080034483FFC0346F7E7D0F8003823F4FE63C0F8D4 -S315080034580038D0F80038090101F4FE610B43C0F8BA -S3150800346800380020704708B5D0F8043823F002035E -S31508003478C0F804380320FDF7E7FC002008BD08B5A6 -S31508003488D0F8043843F00203C0F804380320FDF7DF -S31508003498DBFC002008BD4269806910407047D0F8F7 -S315080034A8183800F50060C0691840000C7047D0F855 -S315080034B8183800F50060C069184080B2704700EBFC -S315080034C84111D1F8082B00F5006040691040704793 -S315080034D810B4D0F81048D0F8343801F00F02D340A9 -S315080034E8DB01DBB2234300EB411000F5106080686E -S315080034F818405DF8044B7047406900F001007047B2 -S31508003508D0F800290B4B1340C0F8003900F50063C2 -S315080035189A6802F00602042A05D05A6842F48072AC -S315080035285A6000207047D0F8002942F00302C0F814 -S315080035380029F2E700F8FFFF10B4046C154B9C420B -S3150800354803D9D0F8003B002B16DB0024C0F8104B33 -S31508003558D0F8104B44F40024C0F8104BD0F8104BA0 -S3150800356844F01804C0F8104BD0F8104B44F0C04487 -S31508003578C0F8104B012903D000205DF8044B7047AA -S31508003588C0F8142BD0F8003B43F08023C0F8003B62 -S31508003598F2E700BF0A30544F084B1A6922F4407202 -S315080035A81A611A6942F004021A611A6942EA002085 -S315080035B840F480301861BFF34F8F7047003C0240D3 -S315080035C810B449B1012923D0022902D04FF4407218 -S315080035D803E04FF4007200E000220F4B1C6924F444 -S315080035E840741C61196911431961196921F0F801B8 -S315080035F819611A6942EAC00242F002021A611A6996 -S3150800360842F480321A61BFF34F8F5DF8044B704756 -S315080036184FF48072E1E700BF003C0240214B1B7D56 -S31508003628012B3CD070B50E4604461E4B01221A756E -S315080036384CF25030FEF70AFC014658BB4FF0FF33F0 -S3150800364833602368012B16D06568A368626813443B -S31508003658AB421FD9217B2846FFF7B2FF4CF2503000 -S31508003668FEF7F4FB104A136923F07A03136101463F -S3150800367878B90135E9E7207BFFF78EFF4CF2503021 -S31508003688FEF7E4FB0146084A136923F004031361AD -S3150800369800E03560034B00221A75084670BD022102 -S315080036A8084670472C0E0020003C024030B40468D7 -S315080036B8606A29B940EA0240A062002030BC704717 -S315080036C80D46A36A00EB13400023691E8B4209D2F4 -S315080036D803F1400104EB8101496800EB114001330D -S315080036E8DBB2F2E740EA024005F13F0104EB81014B -S315080036F84860E2E703685962002070470246036893 -S315080037080121C0F8FC13002082F8F4039A6942F0F4 -S3150800371800629A61596D024A0A435A65704700BFA2 -S31508003728030000107047000012230B8000487047FA -S315080037385404002004230B800048704768040020BE -S315080037480023934216D230B40BE0373401F81340FD -S3150800375800015C00013400250D550133DBB29342A4 -S3150800376806D2040F092CF0D8303401F81340EFE7D5 -S3150800377830BC70477047000038B50A4B18680433E0 -S315080037881C6804331B68C01800D138BD064D0822CA -S31508003798A91CFFF7D5FF042205F112012046FFF7F9 -S315080037A8CFFFF2E720F4F01F6C04002008B51A23AF -S315080037B80B80FFF7E1FF014808BD00BF6C04002035 -S315080037C808B50A4628B905490548FDF72CF90348F6 -S315080037D808BD02490248FDF726F9F8E7480E002011 -S315080037E82451000810B5044C0A4621460348FDF73B -S315080037F81AF9204610BD00BF480E002014510008CB -S3150800380808B50A4628B905490548FDF70CF90348D5 -S3150800381808BD02490248FDF706F9F8E7480E0020F0 -S31508003828F450000808B50A4628B905490548FDF7B9 -S31508003838FAF8034808BD02490248FDF7F4F8F8E71C -S31508003848480E0020FC500008014B1880704700BF3E -S315080038580A05002008B500F097FE0E4B1B6898422B -S315080038680FD30D4B1B786BB90B4B01221A700B4BF8 -S3150800387880229A6100F088FE094B1B881844054B7C -S31508003888186008BD044B00221A70044B4FF4000256 -S315080038989A61EFE7100500200C0500200004024095 -S315080038A80A050020024B4FF400029A61704700BFD0 -S315080038B80004024008B5054B1B6913F4005F01D0E4 -S315080038C8002008BDFFF7EEFF0120FAE700080240CE -S315080038D808B56420FFF7B8FF08BD08B5FFF7BAFFB3 -S315080038E808BD70477047704708B5304A136823F013 -S315080038F80F0343F007031360136803F00F03072B3E -S315080039084ED12B4B1A6842F440421A601A6842F4A0 -S3150800391880321A6003F5E4331A6842F480221A6082 -S315080039281A6842F480321A60224B1B6813F4003F67 -S31508003938FAD0204B5A6820491140204A0A435A604F -S315080039485A681F4911401F4A0A435A601A6842F0C2 -S3150800395880721A60174B1B6813F0007FFAD0154B54 -S315080039689A6822F0F0029A609A6822F4E05242F4C1 -S31508003978A0529A609A6822F4604242F400429A6019 -S315080039889A6822F0030242F002029A60094B9B6881 -S3150800399803F00C03082BF9D10B48FEF75FFD08BDA9 -S315080039A86A210A4800F0C0FAABE700BF003C0240AB -S315080039B800700040003802400080BCFF086C4000D8 -S315080039C80080BFF0086C400900E6DF0C3851000893 -S315080039D808B5FDF72DFAFFF787FF08BD08B5FFF705 -S315080039E8F7FF00F0ADFA00F0B9FAFCE72DE9F04365 -S315080039F891B04C4C636C43F480436364636C03F482 -S31508003A0880430993099B236C43F080532364236CF2 -S31508003A1803F080530893089B236B43F00103236341 -S31508003A28236B03F001030793079B236B43F00203F9 -S31508003A382363236B03F002030693069B236B43F069 -S31508003A4804032363236B03F004030593059B236B85 -S31508003A5843F008032363236B03F008030493049BCA -S31508003A68236C43F480232364236C03F48023039391 -S31508003A78039B236C43F000732364236C03F00073E1 -S31508003A880293029B80230A9301230B9300250C9526 -S31508003A980D950E95DFF89C800AA94046FEF78EF824 -S31508003AA84FF40003C8F818304FF400530A930B95DF -S31508003AB80E950AA91C48FEF781F84FF44079CDF807 -S31508003AC8289002270B9703260C960D950E95072323 -S31508003AD80F930AA91548FEF771F8CDF828900B97A1 -S31508003AE80C960D950E9509230F930AA94046FEF7DD -S31508003AF865F84FF4C0530A930B970C960D950E95D7 -S31508003B080A230F930AA90A48FEF758F8636B43F085 -S31508003B1880036363636B03F080030193019B11B011 -S31508003B28BDE8F0830038024000080240000C024055 -S31508003B38000002400004024010B5FEF729FD1B4CA0 -S31508003B484FF40003A3611A48FDF77AFF1948FDF7F1 -S31508003B5877FF2046FDF774FF1748FDF771FF174BE7 -S31508003B685A6B22F080025A631A6C22F000721A64A1 -S31508003B781A6C22F480221A641A6B22F008021A6355 -S31508003B881A6B22F004021A631A6B22F002021A63ED -S31508003B981A6B22F001021A631A6C22F080521A6410 -S31508003BA85A6C22F480425A6410BD00BF00040240D1 -S31508003BB8000C02400008024000000240003802409B -S31508003BC82023038000487047C00400200A23038086 -S31508003BD800487047E004002008B590F87432032BB3 -S31508003BE801D0002008BD01F0E3F9FAE708B501F0AD -S31508003BF8DFF9002008BD08B5084601F00DFA0020CF -S31508003C0808BD000008B50B7813F0600F06D14B788D -S31508003C180A2B14D00B2B17D0062B01D0002008BD71 -S31508003C284B881B0A212B04D00B491722FCF7A7FB44 -S31508003C38F4E7CA88172A28BF17220849F6E701228F -S31508003C480749FCF79CFBE9E78B7813B9044A136024 -S31508003C58E4E7FCF7EEFBE1E7C9040020D2040020FC -S31508003C681405002010B50446812100F02DF901211C -S31508003C78204600F029F9002010BD000010B50446BA -S31508003C8840230222812100F014F94023022201214F -S31508003C98204600F00EF94023034A0121204600F089 -S31508003CA83BF9002010BD00BF4810002000487047A7 -S31508003CB84810002008B500F57171D0F80004FCF723 -S31508003CC816FF08BD08B5C1EBC10293000344D3F833 -S31508003CD80822D0F80004FCF738FF08BD08B5C1EB80 -S31508003CE8C102930003449A6CD0F80004FCF777FFE6 -S31508003CF808BD08B5D0F80004FDF717F808BD000098 -S31508003D0810B50446C3684BB1022B01D1012106E060 -S31508003D189121074800F008F9012100E00021D4F8AC -S31508003D280004FCF7F0FFD4F80004FCF7C4FF10BD44 -S31508003D384051000810B50446D0F80004FCF7E6FF21 -S31508003D482268D2F8003E43F00103C2F8003E236A0F -S31508003D5823B1044A136943F006031361FFF7C2FD4A -S31508003D6810BD00BF00ED00E010B50446FFF7BBFD27 -S31508003D78D4F80004FCF7D3FF10BD08B5D0F8000442 -S31508003D88FCF7E3FF08BD08B5D0F80004FCF7DBFF2D -S31508003D9808BD10B504460120FFF7A3FDD4F80004B2 -S31508003DA8FCF7D5FF10BD10B504460020FFF799FDAE -S31508003DB8D4F80004FCF7CDFF10BD000003780BB15A -S31508003DC80020704710B503461748C0F80034C3F8F2 -S31508003DD898024FF0A0430360062343600222C2609C -S31508003DE80023036182610122C26103624362C362DE -S31508003DF80363FDF7A7F880B90B4C80212046FFF727 -S31508003E0879FC402200212046FFF750FC8022012138 -S31508003E182046FFF74BFC002010BD40F22511034849 -S31508003E2800F082F8E8E700BF881000204051000833 -S31508003E38D0F8983211F0800F08D101F07F01C1EB54 -S31508003E48C1018A00134493F8FE01704701F07F0107 -S31508003E58C1EBC1018A00134493F83E00704708B5C0 -S31508003E68D0F89802FDF741FD08BD022807D8DFE813 -S31508003E7800F002060400002070470120704702205F -S31508003E88704708B5D0F89802FDF723F9FFF7EDFF54 -S31508003E9808BD08B5D0F89802FDF7E6F8FFF7E5FF7C -S31508003EA808BD08B5D0F89802FDF7F3F8FFF7DDFF67 -S31508003EB808BD10B51C4613462246D0F89802FDF7E9 -S31508003EC870FCFFF7D2FF10BD08B5D0F89802FDF7C9 -S31508003ED8A8FCFFF7CAFF08BD08B5D0F89802FDF791 -S31508003EE837FDFFF7C2FF08BD08B5D0F89802FDF7F9 -S31508003EF870FDFFF7BAFF08BD08B5D0F89802FDF7B8 -S31508003F083CFCFFF7B2FF08BD08B5D0F89802FDF7E4 -S31508003F18F5FCFFF7AAFF08BD08B5D0F89802FDF723 -S31508003F28B6FCFFF7A2FF08BD08B500F005F8FCE7E0 -S31508003F3808B5FFF7CDFC08BD08B5FFF7CEFC08BDE8 -S31508003F4808B500F07BFEFFF7F3FF00F0FBFA01F077 -S31508003F588FF800F057F800F049F808BD08B5FFF7DC -S31508003F68EBFF00F003FB00F061F800F001F808BD6C -S31508003F7808B500F0DFF8012803D00B4B1B78012B96 -S31508003F8800D008BD00F000FB084B1B68084A1268F9 -S31508003F98134403F5FA739842F3D3034B00221A70B5 -S31508003FA800F050FEEDE700BF1C05002018050020AC -S31508003FB820050020014B1860704700BF180500202F -S31508003FC8014B1868704700BF1805002008B5054B4F -S31508003FD81B78012B00D008BD00F0D6FA024B1860F2 -S31508003FE8F9E700BF1C0500202005002008B5044B8A -S31508003FF801221A70FFF7EAFFFFF7BAFF08BD00BFEC -S315080040081C05002010B500F005FA00F0B7FB064CB1 -S315080040180123237000F0EAFA0023237000F0FEFE5D -S315080040280223237010BD00BFEA04002000B583B040 -S315080040380DF10701184800F01DFC012810D00DF1F4 -S315080040480701154800F008FB012812D00DF10701F1 -S31508004058114800F061FF012814D003B05DF804FB8D -S315080040680E4B01221A709DF807100B4800F0F2F95A -S31508004078E5E70A4B00221A709DF80710064800F073 -S31508004088E9F9E3E7054B02221A709DF8071002487A -S3150800409800F0E0F9E1E700BF24050020EA04002063 -S315080040A808B500F0FFFE08BD38B504460D460E4BA8 -S315080040B81B78012B09D00C4B1B7853B10A4B1B787C -S315080040C8022B0BD000F0BEF938BDC9B200F0ACFB24 -S315080040D8F1E7E9B2204600F0A3FAEFE7E9B220468D -S315080040E800F0F0FEEEE700BFEA040020074B1B7855 -S315080040F8022B05D0032B05D0012B05D0402070478D -S315080041083F2070470020704708207047EA040020BF -S31508004118074B1B78022B05D0032B05D0012B05D09E -S31508004128402070473F207047002070470820704796 -S31508004138EA04002008B500F07BF9034600B101231C -S31508004148184608BD014B00225A70704764050020BE -S31508004158034BFE22DA7018710222A3F8442070472E -S315080041686405002010B5054C00232370FFF7EAFF05 -S31508004178FF23E3700123A4F8443010BD640500202A -S31508004188064BFF22DA7000221A71597859719A710A -S31508004198DA711A720622A3F84420704764050020CB -S315080041A808B50020FFF7D4FF08BD0000074BFF221B -S315080041B8DA70074A9A6400221A715A719A710722A4 -S315080041C8C3F807200822A3F844207047640500208E -S315080041D84C510008044BFF22DA7042689A6401229F -S315080041E8A3F84420704700BF6405002008B53120AD -S315080041F8FFF7AEFF08BD000038B5084CFF23E3708B -S31508004208002525716571FFF771FFA071E5712572A3 -S3150800421865720723A4F8443038BD00BF640500203A -S3150800422838B5FFF78FFF0E4C01252570FF23E3707D -S315080042381023237100236371FFF758FFA071FFF756 -S3150800424867FFE071FFF764FFC0F307202072657205 -S31508004258A5720823A4F8443000F00AFF38BD00BF49 -S315080042686405002038B50546FFF740FF6A7890428E -S315080042780FD90A4CA16C201D00F004FDFF23E3703A -S315080042886A78A36C1344A3646B780133A4F84430A2 -S3150800429838BD2220FFF75CFFFAE700BF6405002057 -S315080042A838B50446FFF722FF6378984211D9616842 -S315080042B80A4DA9646278281D00F0E4FCFF23EB7018 -S315080042C86278AB6C1344AB6463780133A5F8443061 -S315080042D838BD2220FFF73CFFFAE700BF6405002037 -S315080042E8F8B50546174600244E1E39B115F8013BA0 -S315080042F81C44E4B2FFF720FE3146F5E73C6001208E -S31508004308F8BD000010B5084CFF23E370E21D4168AC -S31508004318A06CFFF7E5FF207100236371A3710823DA -S31508004328A4F8443010BD00BF6405002038B505461A -S315080043380D4B9C6CFFF7DAFE6A1C411E204600F0FE -S315080043489BFE60B1084CFF23E370FFF7CFFE0138E8 -S31508004358A36C0344A3640123A4F8443038BD312070 -S31508004368FFF7F6FEFAE700BF6405002010B5044615 -S31508004378FFF7BCFE01386378984213DD114BFF221C -S31508004388DA700122A3F84420617879B1A21C0D4B92 -S31508004398986C00F071FE88B161780A4A936C0B44F0 -S315080043A8936410BD2220FFF7D3FEFAE700F074FEE7 -S315080043B80028F6D13120FFF7CBFEF2E73120FFF7C8 -S315080043C8C7FEEEE76405002008B54168074B986CF8 -S315080043D800F056FE30B1054BFF22DA700122A3F829 -S315080043E8442008BD3120FFF7B3FEFAE7640500202C -S315080043F808B500F027FC034BFF22DA700122A3F860 -S31508004408442008BD6405002008B589B2FFF74CFEAC -S3150800441808BD0000054B00221A709A6483F84320E9 -S31508004428A3F844209A705A70704700BF64050020A4 -S31508004438034B1B780BB1012070470020704700BF5B -S3150800444864050020024B002283F84320704700BF0A -S315080044586405002008B50378FF2B23D0354A12785F -S31508004468012A2BD1C93B352B53D8DFE803F0405234 -S31508004478524F52524C434946525252525252525233 -S3150800448852525252525252525252525252525252F6 -S315080044985252525252525252312B282E525252349A -S315080044A852373A3DFFF7BCFE224B93F84330012BAF -S315080044B833D0204BB3F94410002932DC08BDFFF786 -S315080044C8D1FEF1E7FFF7ECFEEEE7FFF783FEEBE731 -S315080044D8FFF718FFE8E7FFF769FEE5E7FFF760FE6D -S315080044E8E2E7FFF74DFEDFE7FFF73CFEDCE7FFF7FD -S315080044F81DFFD9E7FFF73AFFD6E7FFF77DFED3E7B3 -S31508004508FFF762FFD0E7FFF773FFCDE7FFF76EFE09 -S31508004518CAE72020FFF71CFEC6E71020FFF718FE9B -S31508004528C7E71846012380F843300330FFF76CFFC6 -S31508004538C4E700BF64050020014B00221A607047D3 -S3150800454810E000E008B5FFF7F7FF054B054A5A6083 -S3150800455800229A6005211960034B1A6008BD00BF3E -S3150800456810E000E0BF4B0300B0050020044B1B68B1 -S3150800457813F4803F03D0034A136801331360704766 -S3150800458810E000E0B005002008B5FFF7EFFF014B83 -S31508004598186808BDB005002008B5FFF7F5FF08BD7F -S315080045A870470000054BDB6913F0200F04D0034B56 -S315080045B85B6A037001207047002070470048004076 -S315080045C810B5094B9862FFF7DFFF00F10A04064B9E -S315080045D8DB6913F0800F05D1FFF7AEFCFFF7D4FFB0 -S315080045E8A042F4D910BD00BF0048004010B588B0F5 -S315080045F84FF46143019300230293039304930C2217 -S31508004608059206930793054C01A92046FDF72CFF4A -S31508004618236843F00103236008B010BD0048004032 -S3150800462870B506460D4640290ED82846FFF7C8FF36 -S315080046380024ABB2A3420CD9FFF77EFC305DFFF726 -S31508004648BFFF0134A4B2F4E781210248FFF76CFCE6 -S31508004658EBE770BD5451000870B5254B1C78BCB9FA -S315080046682448FFF79FFF012801D0204670BD214B3B -S315080046781B78013BDBB23F2BF7D8FFF785FF1E4BAC -S3150800468818601E4B00221A70194B01221A70ECE7A3 -S3150800469806460D46194B1B78013316481844FFF78A -S315080046A881FF0446012815D1144B1A780132D2B273 -S315080046B81A70104B1B789A4201D00024D5E7104986 -S315080046C8304600F0DFFA0A4B00221A700B4B1B78AB -S315080046D82B70CAE7FFF758FF074B1B6864339842E5 -S315080046E803D90024024B1C70BFE70024BDE700BFAE -S315080046F8F5050020B4050020F8050020F605002079 -S31508004708B50500202DE9F04184B004460D46174644 -S3150800471898466846FDF7DCFF0299164BA3FB01315C -S315080047288909002201E00132D2B2112A1DD8124B9A -S3150800473813F8120003EB420393F801C000EB0C03CD -S3150800474803FB0443B1FBF3FE03FB1E16002EEAD156 -S315080047581FFA8EF32B80013B9BB2B3F5806FE2D22A -S31508004768387088F800C0012000E0002004B0BDE8D1 -S31508004778F08100BFD34D6210A451000870B58CB003 -S315080047880023ADF82E308DF82D308DF82C300BAB74 -S315080047980DF12D020DF12E014FF4FA70FFF7B2FF55 -S315080047A8002835D01D4C1E4B2360002525766576D6 -S315080047B8A5760126E67625776577A560E5609DF8EE -S315080047C82D30013B1B0423619DF82C30013B1B054A -S315080047D86361BDF82E3063602046FDF7B2FB069587 -S315080047E8079508964CF6E043019302954FF6E07351 -S315080047F8039304230493059509960E230A9301A99E -S315080048082046FDF745FC2046FDF7D8FC0CB070BDE0 -S31508004818B5210448FFF788FBC4E700BFFC0500205C -S31508004828006400407C51000810B588B040F2E17376 -S315080048380293002304930593069101AB024602A945 -S315080048480B48FDF7E9FC08B108B010BDFFF79CFE58 -S3150800485800F1320401990648FDF754FD0028F3D003 -S31508004868FFF76AFBFFF790FEA042F3D9ECE700BF13 -S31508004878FC05002010B588B00C46034601AA00219D -S315080048880A48FDF751FD60B9019A40F267639A42F2 -S3150800489801D0002006E0039B33B9059B237001204D -S315080048A800E0002008B010BD0020FBE7FC0500204A -S315080048B838B50546002401E00134E4B2062C15D8BB -S315080048C8FFF73AFB04EB44029300094AD358AB4274 -S315080048D8F2D804EB44029100054A0A445268134484 -S315080048E8AB42E9D9024B0B44187A00E0FF2038BDE1 -S315080048F8C851000808B5C1F3080353B903688B42C1 -S3150800490809D040F8041B4FF4007200F0BBF90120E7 -S3150800491808BD0020FCE70120FAE72DE9F041074623 -S31508004928FDF772FA002400E001347F2C14D83E689B -S31508004938A30006EB03083B445D68FFF7FDFA2A4621 -S31508004948002341460220FDF7B3FA38B956F8243051 -S31508004958AB42E9D0002402E0012400E00024FDF778 -S315080049686BFA2046BDE8F08138B50D460C4B9842DF -S3150800497811D004460B4B994207D1094C29462046C3 -S31508004988FFF7B8FF48B1204638BDFFF7C6FF00282D -S31508004998F4D10024F7E7044CF0E70024F3E700BF56 -S315080049A82808002000800008240600202DE9F04188 -S315080049B806460C4617461D46DFF8748001EA0808BD -S315080049C80368B3F1FF3F07D0336843450BD1336813 -S315080049D8E41A3444043415E04146FFF78BFF0346CE -S315080049E80028F1D11FE041463046FFF7BDFF0646CD -S315080049F80028ECD1002316E017F8013B04F8013B20 -S31508004A08013D0FD0FFF798FA331DE31AB3F5007F77 -S31508004A18F2D308F500713046FFF7A6FF064628B117 -S31508004A28041DE9E701231846BDE8F0810023FAE7E3 -S31508004A3800FEFFFF70B586B004460E4600230193B4 -S31508004A48884219D80125ECB1072E1FD8DDB10023F5 -S31508004A5802930223059301230493FDF7D5F9B4427B -S31508004A680DD8FFF769FA039401A902A8FEF7D6FD3F -S31508004A7820B90134E4B2F2E70025E4E70025FDF79A -S31508004A88DBF900E00025284606B070BD0025FAE7E0 -S31508004A984FF0FF33024A1360024A1360704700BF9B -S31508004AA8240600202808002070B54B1E134C241A2B -S31508004AB8A34201D9002070BD16460D460446FFF7E5 -S31508004AC8F7FEFF2811D028190138FFF7F1FEFF284D -S31508004AD80BD00B4B23400B4A934208D02B46324641 -S31508004AE821460948FFF762FFE5E70020E3E72B467A -S31508004AF8324621460548FFF759FFDCE7FFFF0F084E -S31508004B0800FEFFFF00800008240600202808002071 -S31508004B184A1E0D4B1B1A9A4201D90020704770B5D8 -S31508004B280C460546FFF7C4FE064660190138FFF726 -S31508004B38BFFEFF2818BFFF2E01D1002070BD014611 -S31508004B483046FFF777FFF9E7FFFF0F08104B1B689A -S31508004B58B3F1FF3F19D000B583B00D4A5368916881 -S31508004B680B44D1680B4411690B4451690B4491698C -S31508004B780B44D26913445B42019301AA04210548F0 -S31508004B88FFF792FF03B05DF804FB0120704700BFEA -S31508004B9828080020C88100080D4B1B680D4A1268B2 -S31508004BA81A440D4B1B6813440C4A126813440C4AE2 -S31508004BB812681A440B4B1B681A440B4B1B681344A0 -S31508004BC80A4A1268DA4201D0002070470120704765 -S31508004BD80080000804800008088000080C80000887 -S31508004BE8108000081480000818800008C88100088A -S31508004BF808B50E4B1B68B3F1FF3F07D10C4B1B6872 -S31508004C08B3F1FF3F09D10123184608BD0748FFF746 -S31508004C1884FE03460028F1D1F6E70548FFF77DFE2E -S31508004C2803460028F0D00123EEE700BF2808002035 -S31508004C3824060020004870470080000808B500F0E0 -S31508004C4836FA08BD10B500F01FFA00B910BDFEF710 -S31508004C5831FE0028FAD0FFF723FAFFF76DFCFCF7B8 -S31508004C68ABF800F015FA054B0340054A936000F0C7 -S31508004C780FFA446800F01DFAA047E7E780FFFF1F10 -S31508004C8800ED00E070B50D460446531E9EB23AB1D3 -S31508004C9815F8013B04F8013BFFF74EF93246F4E7ED -S31508004CA870BD0000094B03F11801002232B19A744D -S31508004CB800225A61064B054A1A6070479A74596168 -S31508004CC8183318310132D2B2F0E700BF6C0A002057 -S31508004CD89C0A00200A4B1B6883B110B45C69084A11 -S31508004CE8146019749860D86000225A7418600139DB -S31508004CF808445860987C5DF8044B7047FF20704755 -S31508004D089C0A002038B504460D4601281CD86200BE -S31508004D182244D100114B0B445A7C1B7C9A4219D069 -S31508004D280E4B0B44DA6815705A7C01325A74DA68E5 -S31508004D380132DA605B689A420ED9084A0846515821 -S31508004D480244D160012038BD4FF4E0710448FFF7EA -S31508004D58EBF8DCE70020F6E70120F4E76C0A002008 -S31508004D681C52000808B50146024B1878FFF7CAFF17 -S31508004D7808BD00BFA00A002038B504460D4601281C -S31508004D881ED804EB4403DA00124B13445B7CEBB1E0 -S31508004D9862002244D1000F4B0B449A6812782A7095 -S31508004DA85A7C013A5A749A6801329A605B689A4240 -S31508004DB80ED9084A0846515802449160012006E06F -S31508004DC84FF4F1710448FFF7AFF8DAE7002038BD69 -S31508004DD80120FCE76C0A00201C52000808B50146A9 -S31508004DE8024B1878FFF7C8FF08BD00BFE40A002081 -S31508004DF810B50446012806D804EB4404E200054B1E -S31508004E081344587C10BD40F202210348FFF78CF87A -S31508004E18F2E700BF6C0A00201C52000838B5FFF7F5 -S31508004E2841FF1A4C4021601CFFF754FF2070184DAB -S31508004E384021681CFFF74EFF28702378FF2B1BD0EC -S31508004E48FF2819D0134C002213492046FBF706FE03 -S31508004E5812492046FBF72BFE0120FEF742FD2046A5 -S31508004E68FBF72CFED4F89802FCF763FCFFF7A8F8C2 -S31508004E78B0F5FA6F05D338BD85210948FFF754F808 -S31508004E88E0E74FF4FA60FFF795F8F4E7A00A002080 -S31508004E98E40A0020280B0020380400208804002093 -S31508004EA81C52000810B5064CD4F89802FCF753FCB7 -S31508004EB82046FBF7EAFD0020FEF713FD10BD00BFEC -S31508004EC8280B002070B506460D463F2906D8284601 -S31508004ED8FFF748FF012806D100240FE0B9210D483D -S31508004EE8FFF722F8F3E7BD210A48FFF71DF8F3E7AD -S31508004EF8C6210848FFF718F80134A4B2ABB2A34292 -S31508004F0807D9FFF719F8305DFFF72CFF0128F3D00A -S31508004F18EEE770BD1C52000870B506460D461F4BD5 -S31508004F28D3F89802FCF798F91D4B1C789CB91D48CC -S31508004F38FFF754FF012801D0204670BD194B1B788E -S31508004F48013BDBB23E2BF7D8154B01221A70164BDC -S31508004F5800221A70F0E7144B1B78013311481844DD -S31508004F68FFF73CFF0446012801D00024E4E70E4B6E -S31508004F781A780132D2B21A700A4B1B789A4201D0B3 -S31508004F880024D9E709493046FFF77CFE044B00227E -S31508004F981A70054B1B782B70CEE700BF280B00202C -S31508004FA8040E0020C40D0020050E0020C50D0020A3 -S31508004FB830B583B0144B1878FFF71AFF08B30546BF -S31508004FC8402800D9402500240AE04FF4A3710F4869 -S31508004FD8FEF7AAFF9DF807200D4B1A550134E4B2CF -S31508004FE8A54208D90DF10701074B1878FFF7C4FE43 -S31508004FF80128EFD0E9E7ABB2054A81210548FEF753 -S3150800500883FF03B030BD00BFA00A00201C52000869 -S315080050182C0A0020280B002070B50446FEF746FE29 -S31508005028064621460F48FEF71AFF85B2002406E011 -S315080050384FF4B4710C48FEF777FF0134A4B2AC42BA -S3150800504807D2315D094B1878FFF75CFE0128F4D0C2 -S31508005058EEE7FEF72BFE4023024601210148FEF73C -S315080050685BFF70BD280B00201C520008E40A0020CC -S3150800507808B5FFF70DFD08BD08B5FFF715FD08BD0E -S3150800508808B5FFF745FD08BD08B5FFF785FD08BD56 -S3150800509808B5FFF7CFFD08BD08B5FFF757FD034666 -S315080050A808B9184608BDFFF7A3FD0346F9E772B61F -S315080050B8704762B670470000F8B500BFF8BC08BC70 -S315080050C89E467047F8B500BFF8BC08BC9E467047B0 -S315080050D80000002000000000000000000102030490 -S315080050E80607080900000000010203044465666112 -S315080050F8756C740057696E5553422042756C6B205F -S31508005108496E746572666163650000004F70656E66 -S31508005118424C5420557365720000000057696E5555 -S3150800512853422042756C6B204465766963650000B6 -S315080051386D61696E2E630000757362645F636F6ED6 -S31508005148662E63004F70656E424C54002E2E2F2E25 -S315080051582E2F2E2E2F536F757263652F41524D438E -S315080051684D375F53544D333246372F7273323332C5 -S315080051782E6300002E2E2F2E2E2F2E2E2F536F75B0 -S315080051887263652F41524D434D375F53544D333241 -S3150800519846372F63616E2E6300000000050206027B -S315080051A8060307030803090309040A040B040C0485 -S315080051B80C050D050E050F050F0610061007100835 -S315080051C800800008008000000100000000000108B7 -S315080051D8008000000200000000800108008000002E -S315080051E80300000000000208000002000400000096 -S315080051F80000040800000400050000000000080874 -S31508005208000004000600000000000C080000040066 -S31508005218070000002E2E2F2E2E2F2E2E2F536F7599 -S315080052287263652F41524D434D375F53544D3332A0 -S3110800523846372F7573622E6300000000D5 -S30D0800524451020008ED01000803 -S3090800524CC90100087E -S3150800525000000000EC02002054030020BC030020DC -S315080052600000000000000000000000000000000030 -S315080052700000000000000000000000000000000020 -S315080052800000000000000000000000000000000010 -S315080052900000000000000000000000000000000000 -S315080052A000000000000000000000000000000000F0 -S315080052B000000000000000000000000000000000E0 -S315080052C000000000000000000000000000000000D0 -S315080052D000000000000000000000000000000000C0 -S315080052E000000000000000000000000000000000B0 -S315080052F0000000000000000001000000000000009F -S315080053000E33CDAB34126DE6ECDE05000B00000063 -S31508005310000000000000000000000000000000007F -S31508005320000000000000000000000000000000006F -S31508005330000000000000000000000000000000005F -S31508005340000000000000000000000000000000004F -S31508005350000000000000000000000000000000003F -S31508005360000000000000000000000000000000002F -S31508005370000000000000000000000000000000001F -S31508005380000000000000000000000000000000000F -S3150800539000000000000000000000000000000000FF -S315080053A000000000000000000000000000000000EF -S315080053B000000000000000000000000000000000DF -S315080053C000000000000000000000000000000000CF -S315080053D000000000000000000000000000000000BF -S315080053E000000000000000000000000000000000AF -S315080053F0000000000000000000000000000000009F -S31508005400000000000000000000000000000000008E -S31508005410000000000000000000000000000000007E -S31508005420000000000000000000000000000000006E -S31508005430000000000000000000000000000000005E -S31508005440000000000000000000000000000000004E -S31508005450000000000000000000000000000000003E -S31508005460000000000000000000000000000000002E -S31508005470000000000000000000000000000000001E -S31508005480000000000000000000000000000000000E -S3150800549000000000000000000000000000000000FE -S315080054A000000000000000000000000000000000EE -S315080054B000000000000000000000000000000000DE -S315080054C000000000000000000000000000000000CE -S315080054D000000000000000000000000000000000BE -S315080054E000000000000000000000000000000000AE -S315080054F0000000000000000000000000000000009E -S31508005500000000000000000000000000000000008D -S31508005510000000000000000000000000000000007D -S31508005520000000000000000000000000000000006D -S31508005530000000000000000000000000000000005D -S31508005540000000000000000000000000000000004D -S31508005550000000000000000000000000000000003D -S31508005560000000000000000000000000000000002D -S31508005570000000000000000000000000000000001D -S31508005580000000000000000000000000000000000D -S3150800559000000000000000000000000000000000FD -S315080055A000000000000000000000000000000000ED -S315080055B000000000000000000000000000000000DD -S315080055C000000000000000000000000000000000CD -S315080055D000000000000000000000000000000000BD -S315080055E000000000000000000000000000000000AD -S315080055F0000000000000000000000000000000009D -S31508005600000000000000000000000000000000008C -S31508005610000000000000000000000000000000007C -S31508005620000000000000000000000000000000006C -S31508005630000000000000000000000000000000005C -S31508005640000000000000000000000000000000004C -S31508005650000000000000000000000000000000003C -S31508005660000000000000000000000000000000002C -S315080056700000000000000000080E00200024F400CE -S315080056800100000010000000313700083D3700080F -S31508005690ED370008C9370008B5370008093800088B -S315080056A02D3800081201000200000040501DAC60B1 -S315080056B00002010203010000040309041A030000A2 -S315080056C000000000000000000000000000000000CC -S315080056D00000000000000000853C00086D3C000842 -S315080056E00D3C00080000000000000000F53B000823 -S315080056F0FF3B0008E13B0008000000000000000036 -S3150800570000000000C93B000800000000D53B000867 -S3150800571009022000010100C0320904000002FF004E -S315080057200000070581024000FF070501024000FF4F -S311080057300A060002000000400100040008 +S31508000408C0F8A432FFF7D8FFF9E70B7803704B78E2 +S3150800041843708B78CA7843EA022343800B794A7972 +S3150800042843EA022383808B79CA7943EA0223C38085 +S31508000438704710B50446802103F0B0FD0021204618 +S3150800044803F0ACFD10BD30B583B004460D46002355 +S31508000458ADF806304A88130A013B062B00F2AB8032 +S31508000468DFE803F0041F33A9A98D9A00D0F8B4323F +S315080004781B680DF10601007C9847EA88002A00F0F7 +S31508000488A380BDF80630002B00F099809A4228BF51 +S315080004981A46ADF8062001462046FFF770FF03B056 +S315080004A830BD037C43B9D0F8B8329B6A0DF1060013 +S315080004B8984702234370E0E7D0F8B832DB6A0DF1B3 +S315080004C80600984702234370D7E7D2B2052A52D8BE +S315080004D8DFE802F003101D2A3744D0F8B4325B6807 +S315080004E823B10DF10601007C9847C6E72946FFF7B0 +S315080004F8A0FFD4E7D0F8B4329B6823B10DF1060102 +S31508000508007C9847B9E72946FFF793FFC7E7D0F86D +S31508000518B432DB6823B10DF10601007C9847ACE7D5 +S315080005282946FFF786FFBAE7D0F8B4321B6923B124 +S315080005380DF10601007C98479FE72946FFF779FFE2 +S31508000548ADE7D0F8B4325B6923B10DF10601007C3A +S31508000558984792E72946FFF76CFFA0E7D0F8B43228 +S315080005689B6923B10DF10601007C984785E7294662 +S31508000578FFF75FFF93E72946FFF75BFF8FE7037CE3 +S3150800058833B9D0F8B8325B6B0DF10600984774E7B3 +S315080005982946FFF74EFF82E7037C43B9D0F8B832FD +S315080005A81B6B0DF1060098470723437065E7294634 +S315080005B8FFF73FFF73E72946FFF73BFF6FE7294633 +S315080005C82046FFF736FF6AE72046FFF7F5FE66E797 +S315080005D838B504468B88F3B9CB88E3B94B887F2BA3 +S315080005E819D803F07F0590F89C32032B0CD080F8B5 +S315080005F89E52294603F0E2FC2046FFF7DDFE35B198 +S31508000608022384F89C3209E0FFF713FF06E001236A +S3150800061884F89C3202E02046FFF70BFF38BD00003D +S3150800062870B504460D4689782E4B1970012910D8DD +S3150800063890F89C32022B11D0032B25D02946FFF7B8 +S31508000648F8FE284B1978204600F0A0FA032630460B +S3150800065870BD2946FFF7EDFE0326F8E781B141602C +S3150800066800F08BFA064620B129462046FFF7E1FE38 +S31508000678EDE72046FFF7A0FE032384F89C32E6E759 +S31508000688FFF79AFE0026E2E7C9B14368994225D0E2 +S31508000698D9B200F07BFA134B19786160204600F04E +S315080006A86CFA0646B0B129462046FFF7C2FE2179FC +S315080006B8204600F06BFA022384F89C32C7E7022327 +S315080006C880F89C32416000F061FA2046FFF774FE14 +S315080006D80026BCE72046FFF76FFEB8E7FFF76CFE73 +S315080006E80026B4E70805002008B5CB88012B0CD1ED +S315080006F890F89C325AB29AB1022B09D9032B0FD11A +S315080007080122011DFFF73BFE01E0FFF792FE08BD37 +S315080007180146002341F8083F0122FFF730FEF6E7B5 +S31508000728FFF787FEF3E708B590F89C32013B022BE2 +S3150800073812D8CB88022B0CD10123C360D0F8A43277 +S315080007480BB10323C360022200F10C01FFF717FE61 +S3150800075808BDFFF76EFEFBE7FFF76BFEF8E708B57F +S3150800076890F89C32013B022B09D84B88012B00D004 +S3150800077808BD0023C0F8A432FFF71EFEF8E7FFF706 +S3150800078858FEF5E708B50B7803F06003202B06D06A +S31508000798402B04D043B1FFF74CFE002003E0D0F805 +S315080007A8B8329B68984708BD4B78092B21D8DFE8EB +S315080007B803F0141C201820090520100DFFF743FE26 +S315080007C80020F0E7FFF704FF0020ECE7FFF728FF13 +S315080007D8E9E7FFF789FF0020E5E7FFF7A4FF002010 +S315080007E8E1E7FFF708FE0020DDE7FFF7B8FF00207E +S315080007F8D9E7FFF71EFE0020D5E770B505460C4673 +S315080008080B7803F06003202B07D0402B05D023B1C3 +S31508000818FFF70FFE0026304670BD95F89C32013B5F +S31508000828022B18D82379012B0FD8D5F8B8329B682C +S315080008382146284698470646E388002BEBD1002828 +S31508000848E9D12846FFF7B8FDE5E721462846FFF728 +S31508000858F0FD0026DFE721462846FFF7EAFD0026D1 +S31508000868D9E738B505460C468A880B7803F060033D +S31508000878202B08D0D1B2402B05D05BB12146FFF713 +S31508000888D8FD002005E0D5F8B8329B6821462846E9 +S31508000898984738BD6378012B3DD058B200286FD0E9 +S315080008A8032B40F0F68095F89C32022B07D0032BD1 +S315080008B81CD021462846FFF7BCFD0020E9E7B1F120 +S315080008C8800318BF0123002908BF002343B128461F +S315080008D803F064FB8021284603F060FB0020D8E774 +S315080008E821462846FFF7A5FD0020D2E763884BB9BD +S315080008F8B1F1800318BF0123002908BF00230BB1F3 +S31508000908E38823B12846FFF757FD0020C1E72846A4 +S3150800091803F044FBF6E790F89C32022B06D0032B2B +S3150800092819D02146FFF785FD0020B2E7B1F180030B +S3150800093818BF0123002908BF00233BB103F02EFB8B +S315080009488021284603F02AFB0020A2E72146FFF764 +S3150800095870FD00209DE76388002B40F0A08011F009 +S315080009687F0F0AD12846FFF727FDD5F8B8329B68C6 +S3150800097821462846984700208BE703F017FBF1E73E +S3150800098895F89C32022B07D0032B31D021462846EE +S31508000998FFF74FFD00207CE7B1F1800318BF01235C +S315080009A8002908BF00239BB912F0800F16D101F061 +S315080009B87F0101EB81018B0003F5A87129440431F5 +S315080009C800240C6002222846FFF7D9FC204660E777 +S315080009D821462846FFF72DFD00205AE701F07F013A +S315080009E801EB81018B0003F1100129440431E7E783 +S315080009F852B2002A24DB01F00F0303EB83039800A5 +S31508000A082844B0F8643153B3002A2EDB01F07F027C +S31508000A1802EB8202930003F5A8742C440434802957 +S31508000A2814BF00230123002908BF01233BB3002371 +S31508000A382360022221462846FFF7A1FC002028E762 +S31508000A4801F00F0303EB830398002844838C002BDB +S31508000A58DAD121462846FFF7ECFC002019E721469B +S31508000A682846FFF7E6FC002013E701F07F0202EBB1 +S31508000A788202930003F110042C440434CFE7284675 +S31508000A8803F038FA10B101232360D2E70023236064 +S31508000A98CFE721462846FFF7CCFC0020F9E60020D8 +S31508000AA8F7E6C0B170B50D4616460446FFF79AFC38 +S31508000AB8013040003080287003236B7002232278A7 +S31508000AC842B1EA5401345A1CD2B20021A95402335D +S31508000AD8DBB2F4E770BD7047C0B108B50346D0F875 +S31508000AE8B80210B10020C3F8B802D3F8CC0210B186 +S31508000AF80020C3F8CC0209B1C3F8B412184601237A +S31508000B0880F89C32027003F0BBF908BD03207047D1 +S31508000B1810B50446012380F89C32D0F8B83213B1D0 +S31508000B285B6801799847D4F8CC3213B10023C4F826 +S31508000B38CC32204603F017FA034608B1184610BD0A +S31508000B48204603F000FA0346F8E710B582B00023FA +S31508000B58ADF8063059B10446C4F8B812CB6A0DF197 +S31508000B6806009847C4F8CC02002002B010BD03203E +S31508000B78FBE708B503F0EFF908BD08B5D0F8B832B1 +S31508000B8813B11B68984708BD0320FCE708B5D0F8D9 +S31508000B98B8320BB15B689847002008BD38B50446DB +S31508000BA800F2AA252846FFF730FC0123C4F8943238 +S31508000BB8B4F8B032C4F8983294F8AA1201F01F03B0 +S31508000BC8012B0ED05AB23AB1022B0FD001F0800190 +S31508000BD8204603F0E3F903E029462046FFF7D2FD4D +S31508000BE838BD29462046FFF708FEF9E72946204674 +S31508000BF8FFF737FEF4E710B5044631BB1346D0F8BD +S31508000C089422032A01D0002010BDD0F85C11D0F830 +S31508000C18602191420CD8D0F8B8321B691BB190F8FC +S31508000C289C22032A0FD02046FFF7C6FB0020EBE7D5 +S31508000C38891AC0F85C118A4228BF0A461946FFF77E +S31508000C48B3FB0020E0E79847EDE70A46D0F8B83244 +S31508000C589B6933B190F89C12032904D11146984729 +S31508000C68D2E70320D0E70320CEE710B504460029CB +S31508000C7847D11346D0F89422022A05D094F8A03210 +S31508000C88012B3AD0002010BDC269016A8A4211D8E0 +S31508000C988A421BD0D4F8B832DB681BB194F89C2278 +S31508000CA8032A27D08021204603F078F92046FFF743 +S31508000CB88EFBE3E7521AC2611946FFF76DFB00235C +S31508000CC81A461946204603F089F9D7E783699942EF +S31508000CD8E0D8D0F898229342DCD200221146FFF7D2 +S31508000CE85BFB0021C4F898120B460A46204603F017 +S31508000CF875F9C3E720469847D4E7002084F8A00288 +S31508000D08C1E70A46D0F8B8325B6933B190F89C1245 +S31508000D18032904D111469847B5E70320B3E703200A +S31508000D28B1E770B50446012380F89C320023C0F861 +S31508000D3894324360C0F8A432D0F8BC3223B1D0F854 +S31508000D48B8325B680021984740230022114620469E +S31508000D5803F011F90126A4F864614025C4F8605126 +S31508000D682B4600228021204603F005F9A684256231 +S31508000D78002070BD01740020704790F89C3280F8F6 +S31508000D889D32042380F89C320020704790F89C32E4 +S31508000D98042B01D00020704790F89D3280F89C32C9 +S31508000DA8F8E708B590F89C32032B01D0002008BD57 +S31508000DB8D0F8B832DB69002BF8D09847F6E7002058 +S31508000DC87047002070470020704708B5012380F84F +S31508000DD89C32D0F8B83213B15B680179984700207D +S31508000DE808BD0000054BD3F8882042F47002C3F802 +S31508000DF888204FF000629A60704700BF00ED00E057 +S31508000E0810B5094B4FF0FF321A6200241C625A6269 +S31508000E185C621A611C615A615C619A619C6102F0A4 +S31508000E28EDFE204610BD00BF0038024010B5044646 +S31508000E380E4B18784FF47A73B3FBF0F30C4A106824 +S31508000E48B0FBF3F001F060FE68B90F2C01D9012058 +S31508000E580AE0002221464FF0FF3001F023FE054B39 +S31508000E681C60002000E0012010BD00BF30040020EF +S31508000E782C0400203404002008B5032001F000FEE5 +S31508000E880020FFF7D3FF02F013FE002008BD00007C +S31508000E9838B5044603F0E2FB0546B4F1FF3F02D035 +S31508000EA8044B1B781C4403F0D9FB401BA042FAD319 +S31508000EB838BD00BF300400202DE9F04782B0D0F8CD +S31508000EC80080CA00521A930003445A6D1B6D9A4251 +S31508000ED855D8C1469B1AC1EBC104A2000244526CFC +S31508000EE89A4200D31A460C46074602F1030A4FEA05 +S31508000EF89A0A15E006F1030A4FEA9A0AE3001B1B49 +S31508000F089D003D44A96C3B7C0093B3B2E2B24046CF +S31508000F1802F056F9AB6C3344AB646B6D1E446E65D0 +S31508000F2809EB441303F510639B699BB2534512D327 +S31508000F38E3001B1B9A003A44516D136D99420AD275 +S31508000F484BB15B1AC4EBC4018A003A44566C9E42FC +S31508000F58D0D31E46CEE7E3001B1B980007443A6D1C +S31508000F687B6D9A420FD804F00F040123A340D8F8E2 +S31508000F78344824EA0304C8F83448002000E001206D +S31508000F8802B0BDE8F0870020FAE77047F0B58BB0E5 +S31508000F98002800F091800446056890F8BD3323B30D +S31508000FA8032384F8BD33EB6B13F4807F01D1002348 +S31508000FB82361206801F096FE254655F8107B6E4693 +S31508000FC80FCD0FC60FCD0FC695E8030086E80300B8 +S31508000FD8231D0ECB384601F0CBFD58B1022384F801 +S31508000FE8BD33012528460BB0F0BD80F8BC33FFF7A2 +S31508000FF8CCFFD5E70021206801F07AFE0023656852 +S31508001008AB4216D2D900C81A82002244012082F8B7 +S315080010183D0082F83C30A2F84230002082F83F00B2 +S3150800102850649064CA1A9100214408650133DBB2FA +S31508001038E5E700239D4216D9D800C11A8A0022443A +S31508001048002182F8FD1182F8FC3182F8FF11C2F8F6 +S315080010580412C2F80812C21A90002044C0F81012E6 +S315080010680133DBB2E6E7254655F8107B6E460FCD09 +S315080010780FC60FCD0FC695E8030086E80300231DA3 +S315080010880ECB384601F07AFE054660B9002384F887 +S315080010983830012384F8BD33636A012B08D02068E9 +S315080010A802F05BFA9EE7022384F8BD33012599E727 +S315080010B8204602F085FBF2E7012593E7704790F88A +S315080010C8BC33012B0ED010B50446012380F8BC3377 +S315080010D8006802F036FA206801F0FEFD002084F860 +S315080010E8BC0310BD0220704738B590F8BC33012BF5 +S315080010F818D00446012380F8BC33006801F0F2FDD5 +S31508001108206802F0EAF9054628B1002384F8BC33BA +S315080011180125284638BD206802F01FFA002384F8FE +S31508001128BC33F6E70225F4E768B110B5044603238D +S3150800113880F8BD33FFF7D8FF2046FFF7BFFF00202A +S3150800114884F8BD0310BD01207047000070B5044639 +S315080011580D460068066C00EB411303F530639A6880 +S315080011682169012911D037498E4254D03DB9C5EBBA +S31508001178C50293002344D3F81032002B5CD0E9B299 +S31508001188204602F001FE002070BD12F0080F09D0B3 +S315080011982D498E42F7D912F4004FF4D04FF4004285 +S315080011A89A60F0E712F0200F02D020229A60EAE748 +S315080011B812F0280FE7D124498E4206D912F4004FB7 +S315080011C803D04FF400429A60DDE7E900491B8A001C +S315080011D82244D2F804121B69C3F31203C91AC2F8C7 +S315080011E81412D2F80412D2F808320B44C2F808329C +S315080011F835B9C5EBC50293002344D3F8103223B199 +S31508001208E9B2204602F0C0FDBDE704F57172012176 +S3150800121802F0F4F9F4E712F4004F03D04FF4004251 +S315080012289A60B0E712F0200F01D020229A60E9B23E +S31508001238204602F0A9FDA6E704F57172002102F01E +S31508001248DDF99CE70A31544F0A30544F38B504463D +S3150800125803681D6C03EB4111D1F8082B0E4B9D4210 +S3150800126807D901F5306112F4004F02D04FF4004354 +S315080012788B60204602F080FD074B9D4202D9236900 +S31508001288012B01D0002038BD04F5717201212068B0 +S3150800129802F0B4F9F6E700BF0A30544F2DE9F84FC3 +S315080012A804460568284602F095F908B1BDE8F88F9E +S315080012B82F460646206802F05CF90028F6D0206812 +S315080012C802F057F910F0020F04D02268536903F0A8 +S315080012D802035361206802F04CF910F0100F15D07C +S315080012E82268936923F010039361D5F8208008F0E3 +S315080012F80F09C8F34343022B00F08580062B00F03C +S31508001308A5802268936943F010039361206802F068 +S3150800131830F910F4002F40F0AD80206802F029F962 +S3150800132810F4802F40F0F180206802F022F9002896 +S31508001338C0F25F81206802F01CF910F4006F0AD029 +S31508001348D5F8083813F0010F40F06D812268536903 +S3150800135803F400635361206802F00BF910F0006F7C +S3150800136815D02268536903F00063536194F8F4337F +S31508001378002B40F05C81012184F8F41323685B6D27 +S31508001388C3F38303C4F8F833204602F02DFA20681D +S3150800139802F0EFF810F4805F40F04D81206802F003 +S315080013A8E8F810F4005F40F0AB81206802F0E1F835 +S315080013B810F0080F40F0BC81206802F0DAF810F443 +S315080013C8801F40F0BE81206802F0D3F810F4001F91 +S315080013D840F0C181206802F0CCF810F0804F40F048 +S315080013E8C481206802F0C5F810F0040F3FF45EAF18 +S315080013F823685D6815F0040F40F0C08122685368B9 +S315080014082B43536052E747F6F07318EA030F3FF485 +S3150800141878AF4FEA18184FEAC90BABEB09034FEA3E +S31508001428830AA244C8F30A02DAF80812284601F021 +S31508001438E5FFC8F30A08DAF808324344CAF8083256 +S31508001448DAF814324344CAF814325AE7082204F57B +S315080014587171284601F0D2FFC8F30A184FEAC90382 +S31508001468A3EB09018A002244D2F814324344C2F88D +S31508001478143246E7206802F080F88046B14617E03D +S3150800148807EB49130122C3F8082B49462046FFF7FC +S315080014985DFE1DE007EB49130822C3F8082B4946E9 +S315080014A82046FFF7D3FE16E009F101094FEA580866 +S315080014B8B8F1000F3FF431AF18F0010FF4D05FFA16 +S315080014C889F1206802F069F8824610F0010FD7D131 +S315080014D81AF0080FDED11AF0100F04D007EB4913DB +S315080014E81022C3F8082B1AF0200F04D007EB49136B +S315080014F82022C3F8082B1AF4005FD5D007EB491346 +S315080015084FF40052C3F8082BCEE7206802F03DF8DE +S315080015188046B1462AE05946204602F041FC1AF0B0 +S31508001528080F04D007EB49130822C3F808291AF04C +S31508001538100F04D007EB49131022C3F808291AF02C +S31508001548400F04D007EB49134022C3F808291AF0BC +S31508001558020F04D007EB49130222C3F808291AF028 +S31508001568800F41D109F101094FEA5808B8F1000F6F +S315080015783FF4DAAE18F0010FF4D05FFA89FB594642 +S31508001588206802F013F8824610F0010FC7D009F058 +S315080015980F03012101FA03F2D7F8343823EA0203C4 +S315080015A8C7F8343807EB4913C3F8081923698B4277 +S315080015B8B1D14FEAC902A2EB090293002344596C38 +S315080015C89A6C0A449A64B9F1000FA4D1C9EBC90206 +S315080015D8930023441B6D002B9DD104F571720121DC +S315080015E8206802F00BF896E749462046FFF764FCA0 +S315080015F8B8E7D5F8043823F00103C5F8043894F891 +S31508001608F433012B08D0204602F010FC22685369EF +S3150800161803F0004353618DE6002184F8F41320464D +S3150800162802F0E2F8F2E7204602F0E6FB8EE62046EC +S3150800163802F0E2FBABE605F50068D8F8043023F0BB +S315080016480103C8F804301021206801F069FB20E07E +S3150800165807EB46134FF67F31C3F80819D3F8002964 +S3150800166822F40012C3F80029D3F8002942F00062D0 +S31508001678C3F80029C3F8081BD3F8002B22F4001274 +S31508001688C3F8002BD3F8002B42F00062C3F8002BEE +S3150800169801366368B342DBD8D8F81C3043F0011327 +S315080016A8C8F81C30236BEBB1D8F8843043F00B0329 +S315080016B8C8F88430D8F8443043F00B03C8F84430E7 +S315080016C8D5F8003823F4FE63C5F8003804F57172B6 +S315080016D8217C206801F092FF2268536903F480533D +S315080016E853615BE6D8F8142042F22B031343C8F873 +S315080016F81430D8F8103043F00B03C8F81030DFE779 +S31508001708206801F06BFF206801F008FCE060256896 +S3150800171800F038FC227B0146284601F067FA204685 +S3150800172802F050FB2268536903F4005353613CE600 +S31508001738204602F040FB2268536903F00803536108 +S315080017483AE60021204602F080FB2268536903F432 +S315080017588013536137E60021204602F070FB2268A1 +S31508001768536903F40013536134E6204602F073FB09 +S315080017782268536903F08043536132E6204602F033 +S3150800178874FB3BE690F8BC33012B0BD010B5044626 +S31508001798012380F8BC33006801F0D3FE002084F8E2 +S315080017A8BC0310BD0220704790F8BC33012B0BD040 +S315080017B810B50446012380F8BC33006801F0CDFE55 +S315080017C8002084F8BC0310BD0220704790F8BC338B +S315080017D8012B0DD010B50446012380F8BC3380F8D8 +S315080017E83810006801F09DFE002084F8BC0310BD7F +S315080017F802207047F8B511F0800F27D101F00F05C0 +S31508001808EE00771BBC00274604F5FC740444043430 +S315080018180744002587F8FD5101F00F012170A260E1 +S31508001828E370627802B1E180022B1ED090F8BC33CF +S31508001838012B1DD00546012380F8BC3321460068D4 +S3150800184801F07CFB002085F8BC03F8BD01F00F0603 +S31508001858F500AF1BBC0027463834044404343E461A +S315080018680644012586F83D50D6E700232371DDE7AF +S315080018780220EAE738B511F0800F20D101F00F04ED +S31508001888E200151BAB001D4603F5FC73034404333D +S315080018980544002285F8FD2101F00F01197090F81A +S315080018A8BC23012A1AD00446012280F8BC2319460B +S315080018B8006801F08BFB002084F8BC0338BD01F0F2 +S315080018C80F04E200151BAB001D46383303440433E6 +S315080018D82C460444012284F83D20DDE70220EDE782 +S315080018E870B501F00F05EE00711B8C0004F5FC7449 +S315080018F80444211D761BB4000444C4F80822C4F81D +S3150800190810320023C4F8143284F8FD3184F8FC51E7 +S315080019180369012B06D065B9DAB2006801F0C4FB81 +S31508001928002070BDC5EBC506B4000444C4F80C22F3 +S31508001938F1E7DAB2006801F057FCF1E701F00F01A8 +S31508001948C1EBC1018B001844D0F81402704770B572 +S3150800195801F00F05EE00711B8C0038340444211D74 +S31508001968761BB4000444A264236500236365012337 +S3150800197884F83D3084F83C500369012B06D05DB9DC +S31508001988DAB2006801F090FB002070BDC5EBC50609 +S31508001998B4000444E264F2E7DAB2006801F024FC11 +S315080019A8F2E738B501F00F0543689D4236D811F0BD +S315080019B8800F20D1CA00541AA3001C4603F5FC73ED +S315080019C80344043322460244002182F8FD11012209 +S315080019D89A701D7090F8BC23012A21D0044601226A +S315080019E880F8BC231946006801F01CFD7DB100206B +S315080019F884F8BC0338BDEA00511B8B0019463833F6 +S31508001A08034404330144012281F83D20DFE704F545 +S31508001A187172217C206801F0F1FDE8E70120E9E709 +S31508001A280220E7E710B501F00F0443689C422CD85A +S31508001A3811F0800F1DD1E3001A1B91000A4601F523 +S31508001A48FC71014404310244002382F8FD31002365 +S31508001A588B700C7090F8BC33012B18D00446012300 +S31508001A6880F8BC33006801F00AFD002084F8BC033E +S31508001A7810BDE3001A1B91000A46383101440431A7 +S31508001A880244012382F83D30E1E70120F0E702200D +S31508001A98EEE70000534B98421FD0534B984228D084 +S31508001AA8524B984231D0524B98423AD0514B9842B1 +S31508001AB843D0514B98424CD0504B984255D0504B36 +S31508001AC898425ED04F4B984267D04F4B984270D099 +S31508001AD84E4B984279D00120704703F560531A692E +S31508001AE842F001021A611A6922F001021A610020FD +S31508001AF8704703F550531A6942F002021A611A69C7 +S31508001B0822F002021A610020704703F540531A6949 +S31508001B1842F004021A611A6922F004021A610020C6 +S31508001B28704703F530531A6942F008021A611A69B0 +S31508001B3822F008021A610020704703F520531A6933 +S31508001B4842F010021A611A6922F010021A6100207E +S31508001B58704703F510531A6942F020021A611A6988 +S31508001B6822F020021A610020704703F500531A690B +S31508001B7842F040021A611A6922F040021A610020EE +S31508001B88704703F5E0531A6942F080021A611A6928 +S31508001B9822F080021A610020704703F5C0531A69BB +S31508001BA842F480721A611A6922F480721A61002056 +S31508001BB8704703F5A0531A6942F400721A611A6944 +S31508001BC822F400721A610020704703F580531A69D7 +S31508001BD842F480621A611A6922F480621A61002046 +S31508001BE8704700BF00000240000402400008024097 +S31508001BF8000C02400010024000140240001802407F +S31508001C08001C02400020024000240240002802402E +S31508001C18F0B40C6894FAA4F4B4FA84F44BE08E6829 +S31508001C28826893FAA3F5B5FA85F56D00032707FACE +S31508001C3805F522EA050293FAA3F5B5FA85F56D00C6 +S31508001C4806FA05F52A4382600E68CD68426822EAD4 +S31508001C58060205FB06F52A4342600E69C26893FA2E +S31508001C68A3F5B5FA85F56D00032707FA05F522EAFF +S31508001C78050293FAA3F5B5FA85F56D0006FA05F592 +S31508001C882A43C2604A68022A22D04A68056893FA33 +S31508001C98A3F6B6FA86F67600032707FA06F625EABD +S31508001CA8060593FAA3F3B3FA83F35B0002FA03F380 +S31508001CB82B43036001340B6833FA04F23CD0012243 +S31508001CC8A2401340F6D04A68013A012AC5D8A6E7C1 +S31508001CD893FAA3F2B2FA82F2072A15D84E69026A6B +S31508001CE893FAA3F5B5FA85F5AD000F2707FA05F5B2 +S31508001CF822EA050293FAA3F5B5FA85F5AD0006FAC0 +S31508001D0805F52A430262C0E74D69466A1A0A92FA35 +S31508001D18A2F7B7FA87F7BF004FF00F0C0CFA07F7C8 +S31508001D2826EA070692FAA2F2B2FA82F2920005FAAF +S31508001D3802F232434262A8E70020F0BC704700006E +S31508001D4810B40A490C6924F440740C610C6944F40B +S31508001D5840740C610C6944F001040C61026043602C +S31508001D68BFF34F8F5DF8044B704700BF003C024035 +S31508001D78084B1A6922F440721A611A6942F4007209 +S31508001D881A611A6942F001021A610160BFF34F8F9E +S31508001D98704700BF003C0240084B1A6922F440729B +S31508001DA81A611A6942F480721A611A6942F00102C4 +S31508001DB81A610180BFF34F8F704700BF003C02408D +S31508001DC8074B1A6922F440721A611A691A611A6964 +S31508001DD842F001021A610170BFF34F8F704700BFC6 +S31508001DE8003C02401A4BDB6813F0020F04D0194A6C +S31508001DF8936943F020039361154BDB6813F0100FC2 +S31508001E0804D0144A936943F010039361104BDB68B6 +S31508001E1813F0200F04D00F4A936943F0080393611F +S31508001E280B4BDB6813F0400F04D00A4A936943F05A +S31508001E3804039361064BDB6813F0800F04D0054A48 +S31508001E48936943F002039361014BF222DA60704703 +S31508001E58003C0240600E0020094B1B69002B01DB81 +S31508001E6800207047064B074A5A6002F188325A60C2 +S31508001E781B69002B01DB002070470120704700BF53 +S31508001E88003C024023016745034A136943F00043AF +S31508001E9813610020704700BF003C024038B504466D +S31508001EA8154B00229A6102F0D9FB0546134BDB68ED +S31508001EB813F4803F0AD0B4F1FF3FF7D024B102F0FB +S31508001EC8CDFB401BA042F1D903200DE00B4BDB6884 +S31508001ED813F0F20F09D1094BDB6813F0010F08D08C +S31508001EE8064B0122DA60002038BDFFF77BFF012088 +S31508001EF8FAE70020F8E700BF600E0020003C024021 +S31508001F08F8B51E4C247D012C35D01F4616460D46BD +S31508001F1804461A4B01221A754CF25030FFF7BEFFD9 +S31508001F28014698B9032C07D8DFE804F002151A1FEA +S31508001F38F1B22846FFF744FF4CF25030FFF7AEFFE0 +S31508001F4801460F4A136923F0010313610B4B00225C +S31508001F581A750846F8BDB1B22846FFF71DFFEBE724 +S31508001F6831462846FFF704FFE6E732463B46284649 +S31508001F78FFF7E6FEE0E70221EBE700BF600E002068 +S31508001F88003C0240014B1868704700BF2C0400202B +S31508001F987047002800F0A18038B5044690F820302C +S31508001FA8D3B12268136823F00203136002F056FBC4 +S31508001FB8054623685A6812F0020F10D002F04EFB45 +S31508001FC8401B0A28F5D9636A43F40033636205237C +S31508001FD884F82030012038BDFFF7DAFFE1E71A68F0 +S31508001FE842F001021A6002F039FB054623685A686E +S31508001FF812F0010F0DD102F031FB401B0A28F5D962 +S31508002008636A43F400336362052384F820300120A9 +S31508002018E1E7227E012A3DD01A6822F080021A607A +S31508002028637E012B3BD02268136823F040031360B4 +S31508002038A37E012B39D02268136823F02003136086 +S31508002048E37E012B37D02268136843F01003136028 +S31508002058237F012B35D02268136823F00803136001 +S31508002068637F012B33D02268136823F004031360B7 +S31508002078A368E268134322691343626913436268D3 +S31508002088013A21681343CB6100206062012384F872 +S315080020982030A0E71A6842F080021A60C0E7226872 +S315080020A8136843F040031360C2E72268136843F0D5 +S315080020B820031360C4E72268136823F0100313602B +S315080020C8C6E72268136843F008031360C8E722685E +S315080020D8136843F004031360CAE701207047000039 +S315080020E890F82030013BDBB2012B05D9436A43F44B +S315080020F8802343620120704770B4434BD3F800220B +S3150800210842F00102C3F80022D3F8002222F47C52D6 +S31508002118C3F80022D3F80022486A42EA0022C3F824 +S3150800212800224A6902F01F02012000FA02F2D3F8D7 +S315080021381C42D0430440C3F81C42CB69B3B9324B9E +S31508002148D3F80C420440C3F80C42CE688D884C6913 +S3150800215845EA0645483443F834508E680C884D6974 +S3150800216844EA0644483503EBC5035C60CB69012B92 +S315080021781DD08B69002B32D1234CD4F80432034086 +S31508002188C4F804320B698BBB1F4BD3F814422040A2 +S31508002198C3F814020B6A012B2FD01B4AD2F8003257 +S315080021A823F00103C2F80032002070BC7047164BB2 +S315080021B8D3F80C421443C3F80C420E688D884C6950 +S315080021C845EA0645483443F834508E688C894D6983 +S315080021D844EA0644483503EBC5035C60C9E70A4C7C +S315080021E8D4F804321343C4F80432CBE70648D0F8C7 +S315080021F814321343C0F81432CCE70349D1F81C3219 +S315080022081A43C1F81C22C8E70064004038B590F89C +S315080022182030DBB2012B05D0436A43F4002343621E +S31508002228012038BD0446022380F820300268136866 +S3150800223823F00103136002F011FA054623685B6868 +S3150800224813F0010F0DD002F009FA401B0A28F5D938 +S31508002258636A43F400336362052384F82030012057 +S31508002268DFE700206062DCE770B490F82040056874 +S31508002278AD68013CE4B2012C65D815F0E05F5CD086 +S31508002288C5F30165022D05D9436A43F40003436281 +S3150800229801205DE00124AC401C608B68002B39D115 +S315080022A80E68CB68046843EA465605F118031B010D +S315080022B8E65003680C6905F1180603EB06135C601B +S315080022C80B7D012B31D0D17993791B0443EA01633D +S315080022D8517943EA01231479016823432C012144DF +S315080022E8C1F88C31D17893781B0443EA0163517895 +S315080022F843EA0123117802680B432244C2F888315D +S31508002308016805F118031B01CA5842F00102CA50B0 +S3150800231800201DE04C6843EAC403CC6806682343DA +S3150800232805F1180424013351C3E7036803EB0613C0 +S31508002338596841F480715960C5E7436A43F4001344 +S315080023484362012004E0436A43F480234362012080 +S3150800235870BC704790F82030013BDBB2012B01D9DD +S315080023680020704703689B68890631EA030301D091 +S31508002378012070470020704730B490F82040013C8F +S31508002388E4B2012C00F28A8051B90468E46814F0B2 +S31508002398030F10D1436A43F400134362012082E015 +S315080023A80468246914F0030F05D1436A43F400133B +S315080023B84362012077E0056801F11B0424012C59C2 +S315080023C804F004049460002C5AD1056801F11B0432 +S315080023D824012C59640D1460056801F11B042401B5 +S315080023E82D5905F00205D560056825446D6805F080 +S315080023F80F051561056825446D68C5F307259561B8 +S3150800240805682C446468240C546104680A01144459 +S31508002418D4F8B8411C7004681444D4F8B841C4F315 +S3150800242807245C7004681444D4F8B841C4F3074414 +S315080024389C7004681444D4F8B841240EDC70046807 +S315080024481444D4F8BC411C7104681444D4F8BC413B +S31508002458C4F307245C7104681444D4F8BC41C4F373 +S3150800246807449C7104682244D2F8BC21120EDA711A +S3150800247871B90268D36843F02003D360002012E0DC +S31508002488056801F11B0424012C59E4085460A3E7E4 +S315080024980268136943F020031361EFE7436A43F4BC +S315080024A880234362012030BC70470000014B186046 +S315080024B8704700BF2C04002038B5036813F0010FD5 +S315080024C875D10D46044603683C4A1A404B68C968E4 +S315080024D80B4329690B43A9690B4313430360AB688C +S315080024E8426822F44052134343606B69826822F4B7 +S315080024F8407213438360324B984216D0314B984248 +S3150800250827D0314B984228D0304B984229D0304BA7 +S3150800251898422AD02F4B98422CD02F4B98422ED02F +S315080025282E4B984230D0012042E0032000F010F9E3 +S3150800253800283ED02B68002B3DD0AA69B2F5004F7B +S3150800254827D000EB5300B0FBF3F080B2E060002020 +S315080025582EE00C2000F0FCF8EAE7302000F0F8F846 +S31508002568E6E7C02000F0BEF9E2E74FF4407000F055 +S31508002578B9F9DDE74FF4406000F0EAF8D8E74FF418 +S31508002588405000F0AFF9D3E74FF4404000F0AAF9FD +S31508002598CEE75A0802EB4000B0FBF3F04FF6F073AB +S315080025A80340C0F342001843E060002000E0012021 +S315080025B838BD0120FCE70120FAE700BFF369FFEF01 +S315080025C8001001400044004000480040004C00400C +S315080025D8005000400014014000780040007C00408C +S315080025E882B0224A136843F0010313601F4B1B6825 +S315080025F813F0020FFAD01D4B00229A601A6801924E +S3150800260801991B4A0A400192019A1A601A6822F02F +S31508002618F80242F080021A60144B1B6813F0007F18 +S31508002628FAD1124B1B6813F0006FFAD10F4B1B68CF +S3150800263813F0005FFAD10D4B0E4A5A60103AC3F8E8 +S315080026488420C3F88820DA6822F4FE42DA60DA6859 +S3150800265842F47F02DA605A6F22F001025A675A6F0B +S3150800266842F080725A67002002B07047003802406C +S31508002678FFFFF2EA10300024034B9B68C3F30313E9 +S31508002688024AD35CD840704700380240A051000877 +S31508002698034B9B68C3F38223024AD35CD84070472E +S315080026A800380240B0510008034B9B68C3F3423315 +S315080026B8024AD35CD840704700380240B051000837 +S315080026C80D4B5B6803F480039BB90C480A4B5A68A0 +S315080026D802F03F02B0FBF2F25868C0F3881000FB1C +S315080026E802F05B68C3F3014301335B00B0FBF3F008 +S315080026F870470348EAE700BF003802400024F400A0 +S3150800270800127A0008B5074B9B6803F00C03042BE4 +S3150800271804D0082B04D1FFF7D3FF02E0024800E0F3 +S31508002728024808BD0038024000127A000024F40066 +S3150800273810B50446FFF7E6FF2060FFF79DFF6060C7 +S31508002748FFF7A6FFA0606068FFF7AEFFE06010BD60 +S3150800275808B5032808D00C282DD0B0F5406F51D0FD +S31508002768302877D0002008BD584BD3F8903003405E +S3150800277843EA0040564B98420FD0B0F1031F13D0D6 +S31508002788013B984206D0FFF7BDFFFFF775FFFFF735 +S315080027988BFFE8E7FFF7B6FFE5E74C4B1B6813F036 +S315080027A8020F7ED10020DEE7484B1B6F13F0020F9D +S315080027B879D10020D7E7454BD3F89030034043EA50 +S315080027C80040444B98420FD0B0F10C1F13D0043B7D +S315080027D8984206D0FFF796FFFFF74EFFFFF758FF18 +S315080027E8C1E7FFF78FFFBEE7384B1B6813F0020FE8 +S315080027F85CD10020B7E7354B1B6F13F0020F57D192 +S315080028080020B0E7314BD3F89030034043EA004044 +S31508002818314B984210D0B0F10C2F14D0A3F5806331 +S31508002828984206D0FFF76EFFFFF726FFFFF73CFF33 +S3150800283899E7FFF767FF96E7244B1B6813F0020F23 +S3150800284839D100208FE7214B1B6F13F0020F34D1C3 +S31508002858002088E71D4BD3F89030034043EA004030 +S315080028681E4B98420FD0B0F1301F13D0103B984238 +S3150800287806D0FFF747FFFFF7FFFEFFF709FF72E7E6 +S31508002888FFF740FF6FE7114B1B6813F0020F17D1CC +S31508002898002068E70D4B1B6F13F0020F12D10020BA +S315080028A861E70F485FE74FF400405CE70C485AE7D2 +S315080028B84FF4004057E70A4855E74FF4004052E7F7 +S315080028C8074850E74FF400404DE700BF003802407C +S315080028D80200030008000C000008000C2000300065 +S315080028E80024F40008B5C0280AD0B0F5407F2FD0D8 +S315080028F8B0F5405F54D0B0F5404F79D0002008BDF8 +S31508002908594BD3F89030034043EA0040574B984256 +S315080029180FD0B0F1C01F14D0403B984206D0FFF73D +S31508002928F1FEFFF7A9FEFFF7B3FEE8E7FFF7EAFEB1 +S31508002938E5E74D4B1B6813F0020F40F08180002035 +S31508002948DDE7494B1B6F13F0020F7BD10020D6E752 +S31508002958454BD3F89030034043EA0040444B98422D +S3150800296810D0B0F1032F14D0A3F58073984206D07F +S31508002978FFF7C8FEFFF780FEFFF78AFEBFE7FFF7F7 +S31508002988C1FEBCE7384B1B6813F0020F5DD1002067 +S31508002998B5E7354B1B6F13F0020F58D10020AEE789 +S315080029A8314BD3F89030034043EA0040314B984204 +S315080029B810D0B0F1302F14D0A3F58053984206D022 +S315080029C8FFF7A0FEFFF758FEFFF762FE97E7FFF747 +S315080029D899FE94E7244B1B6813F0020F3AD100209E +S315080029E88DE7214B1B6F13F0020F35D1002086E7C0 +S315080029F81D4BD3F89030034043EA00401E4B9842DB +S31508002A0810D0B0F1C02F14D0A3F58043984206D051 +S31508002A18FFF778FEFFF730FEFFF73AFE6FE7FFF796 +S31508002A2871FE6CE7104B1B6813F0020F17D10020D4 +S31508002A3865E70D4B1B6F13F0020F12D100205EE7F6 +S31508002A480E485CE74FF4004059E70C4857E74FF43F +S31508002A58004054E7094852E74FF400404FE7074853 +S31508002A684DE74FF400404AE7003802408000C000AE +S31508002A780002000300200030008000C00024F40093 +S31508002A880649CB6823F4E0631B041B0C000200F418 +S31508002A98E0600343024A1A43CA60704700ED00E043 +S31508002AA80000FA0530B4154BDB68C3F30223C3F1FB +S31508002AB80704042C28BF04241D1D062D01D9033B31 +S31508002AC800E000234FF0FF3505FA04F421EA040173 +S31508002AD8994005FA03F322EA03031943002805DB9C +S31508002AE80901C9B2064B195430BC704700F00F00EB +S31508002AF80901C9B2034B1954F6E700BF00ED00E017 +S31508002B0800E400E014ED00E00138B0F1807F0AD255 +S31508002B18064B5860064AF02182F823100020986070 +S31508002B2807221A6070470120704700BF10E000E0CE +S31508002B3800ED00E0002301330C4A934211D80269DC +S31508002B48002AF8DA036943F0010303610023013315 +S31508002B58064A934207D8026912F0010FF7D10020F6 +S31508002B687047032070470320704700BF400D0300D5 +S31508002B7884B010B5044603A880E80E00089B012B0C +S31508002B881DD1A36B23F48033A363E268164B134065 +S31508002B98E360E36823F44013E3600F9B012B09D035 +S31508002BA82046FFF7C7FF069B012B14D0BDE8104047 +S31508002BB804B07047E36843F48013E360F0E7E3681A +S31508002BC843F04003E3602046FFF7B4FFA36B43F4E2 +S31508002BD88033A363E7E7A36843F00603A360A36803 +S31508002BE843F02003A360E1E7BFFFBDFF022A0AD02E +S31508002BF80921C26822F47052C260C36843EA812375 +S31508002C08C36000207047274B0B44274A934237D99D +S31508002C18264B0B44264A934234D9264B0B44264A5C +S31508002C28934231D9254B0B4402F5C332A03293425D +S31508002C382CD9234B0B44234A934229D9224B0B44BC +S31508002C4802F5922202F57872934223D91F4B0B4458 +S31508002C5802F5C32202F5207293421DD91C4B0B4478 +S31508002C6802F5B71202F55872934217D9194B0B4455 +S31508002C7802F5122202F5F862934211D80721B8E73D +S31508002C880F21B6E70E21B4E70D21B2E70C21B0E70C +S31508002C980B21AEE70A21ACE70921AAE70821A8E72C +S31508002CA80621A6E7405327FFFF340C00401E1BFFEA +S31508002CB83F420F0000DC0BFF7F4F1200808CF9FEA5 +S31508002CC860B6E5FE5FE3160000D3CEFEC05BB3FE32 +S31508002CD800CA91FEE05459FE836843F001038360F5 +S31508002CE800207047836823F001038360002070473B +S31508002CF808B5C36823F0C043C360012909D069B978 +S31508002D08C36843F08043C3603220FEF7C1F8002049 +S31508002D1808BDC36843F00053C360F5E70120F7E729 +S31508002D28890141F02001016100230133054A9342D4 +S31508002D3805D8026912F0200FF7D100207047032042 +S31508002D48704700BF400D03001023036100230133B9 +S31508002D58054A934205D8026912F0100FF7D10020E8 +S31508002D6870470320704700BF400D0300D0F80038AD +S31508002D781943C0F8001800207047000084B0F8B559 +S31508002D88044607A880E80E00254600230E2B07D818 +S31508002D9803F1400204EB8202002151600133F5E792 +S31508002DA8119B33BBD4F8043843F00203C4F804383B +S31508002DB8A36B23F40013A363236843F0400323603B +S31508002DC8236843F0800323600023C4F8003E04F513 +S31508002DD80066D4F80038C4F800380C9B012B0DD0CF +S31508002DE8032B1CD1099BABB900212046FFF7BEFF70 +S31508002DF819E0A36B43F40013A363E5E7099B23B91A +S31508002E0800212046FFF7B2FF0DE001212046FFF713 +S31508002E18ADFF08E001212046FFF7A8FF03E00321DC +S31508002E282046FFF7A3FF10212046FFF779FF07463C +S31508002E3800B101272046FFF787FF00B101270023C5 +S31508002E4833617361F3610AE0C3B94FF00060C2F8F1 +S31508002E58000900220A614FF67F328A600133079A11 +S31508002E689A4210D905EB431202F51061D2F8000907 +S31508002E780028E9DB0020C2F80009EAE74FF090408D +S31508002E88C2F80009E5E700230AE0C3B94FF0006075 +S31508002E98C2F8000B00220A614FF67F328A600133B6 +S31508002EA8079A9A4210D905EB431202F53061D2F80F +S31508002EB8000B0028E9DB0020C2F8000BEAE74FF010 +S31508002EC89040C2F8000BE5E7336923F48073336151 +S31508002ED80023A3616FF0804363610A9B1BB9A3694A +S31508002EE843F01003A361A2690A4B1343A3610D9B20 +S31508002EF81BB1A36943F00803A361119B012B04D0F6 +S31508002F083846BDE8F84004B07047A269024B134337 +S31508002F18A361F5E700383C8004000040D0F808387B +S31508002F2813F0060305D0062B18BF022B03D102207F +S31508002F387047002070470F207047000070B40B7860 +S31508002F484A78012A20D0D0F81C2803F00F06012455 +S31508002F58B44042EA0442C0F81C2800EB4310D0F8F3 +S31508002F68003B13F4004F0CD1D0F8002B8B68C3F341 +S31508002F780A03C97843EA81431343134A1A43C0F834 +S31508002F88002B002070BC7047D0F81C4803F00F06C9 +S31508002F98B24092B22243C0F81C2800EB4310D0F87E +S31508002FA8002912F4004FECD1D0F800498A68C2F318 +S31508002FB80A02C97842EA814242EA8353234302490C +S31508002FC81943C0F80019DCE70080001030B40B7804 +S31508002FD84A78012A24D000EB4313D3F8002B002A99 +S31508002FE850DBD0F83C580A7802F00F02012404FA9C +S31508002FF802F225EA0242C0F83C28D0F81C280978CB +S3150800300801F00F018C4022EA0444C0F81C48D3F8A2 +S31508003018001B234A0A40C3F8002B002030BC70471F +S3150800302800EB4313D3F80029002A1EDBD0F83C58D6 +S315080030380A7802F00F02012404FA02F292B225EA8B +S315080030480202C0F83C28D0F81C28097801F00F01BC +S315080030588C40A4B222EA0404C0F81C48D3F8001924 +S31508003068104A0A40C3F80029D7E7D3F8002942F0DE +S315080030780062C3F80029D3F8002942F08042C3F851 +S315080030880029D3E7D3F8002B42F00062C3F8002BD7 +S31508003098D3F8002B42F08042C3F8002BA1E700BF03 +S315080030A80078F3EF007833EC70B40B784C78012C81 +S315080030B824D000EB431000F530631D693E4C2C40C4 +S315080030C81C611D693D4C2C401C614C690CB18C680F +S315080030D84C611C6944F400241C611C698D68C5F39D +S315080030E812052C431C61012A61D0D0F8003B43F035 +S315080030F80443C0F8003B002070BC70474C695CBBB1 +S3150800310800EB4314D4F810692C4D3540C4F810590F +S31508003118D4F8105945F40025C4F81059D4F810699C +S31508003128254D3540C4F81059012A31D000EB431310 +S31508003138D3F8002942F00442C3F800294B69002B4A +S31508003148D9D0D0F83428097801F00F040121A14014 +S315080031580A43C0F83428CEE700EB431404F5106494 +S315080031682669154D354025612669144D3540256172 +S315080031784E698D68AE4200D94D61256945F400252A +S31508003188256125694E69C6F3120635432561CBE7DD +S315080031980A691AB100EB4311C1F8142900EB431068 +S315080031A8D0F8002942F00442C0F80029A3E7CA6803 +S315080031B8002A9AD05A6198E70000F8FFFFFF07E04F +S315080031C870B49DF80C4064B903339E08B44208D21B +S315080031D800EB023303F5805351F8045B1D60013494 +S315080031E8F4E7002070BC7047F0B583B00B784C78CC +S315080031F8012C29D000EB431303F5306426697C4D6E +S315080032083540256126697B4D354025614D69002D78 +S3150800321840F0BF8025698E68C6F3120635432561D6 +S31508003228256945F400252561012A00F0C780CA7872 +S31508003238012A00F0C980D3F8002B42F00442C3F8EB +S31508003248002B002003B0F0BD4C6974BB00EB431497 +S31508003258D4F81069674D3540C4F81059D4F8105990 +S3150800326845F40025C4F81059D4F81069604D35405E +S31508003278C4F81059012A4AD000EB4313D3F8004979 +S3150800328844F00444C3F80049CC78012C68D04B694B +S31508003298002BD6D0D0F83428097801F00F0401217C +S315080032A8A1400A43C0F83428CBE700EB4314D4F806 +S315080032B810694F4D3540C4F81059D4F810694D4D6A +S315080032C83540C4F81059D4F810694D698F683D44DB +S315080032D8013DB5FBF7F5484F07EAC5453543C4F838 +S315080032E81059D4F810594E69C6F312063543C4F86E +S315080032F8105904F51064CD78012DBBD1256925F040 +S31508003308C0452561256945F000552561B2E70A6972 +S315080033181AB100EB4314C4F81429CA78012A08D04C +S3150800332800EB4313D3F8002942F00442C3F80029F6 +S3150800333887E7D0F8082812F4807F08D100EB4311F4 +S31508003348D1F8002942F00052C1F80029E8E700EB55 +S315080033584311D1F8002942F08052C1F80029DFE765 +S31508003368D0F8084814F4807F0CD1D3F8004944F003 +S315080033780054C3F8004900928B8A0A78C968FFF78F +S315080033881FFF5EE7D3F8004944F08054C3F80049A4 +S31508003398F1E78E683544013DB5FBF6F52669164F03 +S315080033A807EAC5473E43266127698E68ADB206FB1C +S315080033B805F5C5F312053D43256135E7CA68002AB0 +S315080033C83FF435AF626132E7D0F8082812F4807FF7 +S315080033D806D1D3F8002B42F00052C3F8002B2AE78F +S315080033E8D3F8002B42F08052C3F8002B23E700BF1E +S315080033F80000F8FFFFFF07E00000F81F03329208F5 +S31508003408002393420CD210B400F58054246841F87E +S31508003418044B01339342F7D308465DF8044B7047CB +S31508003428084670470B784A78012A14D000EB4310EF +S31508003438D0F8002B002A06DB2BB1D0F8003B23F086 +S315080034488043C0F8003BD0F8003B43F40013C0F8AB +S31508003458003B0020704700EB4310D0F80029002AEB +S3150800346806DB2BB1D0F8003923F08043C0F80039C1 +S31508003478D0F8003943F40013C0F80039E9E70B78A7 +S315080034884A78012A0ED000EB4310D0F8003B23F403 +S315080034980013C0F8003BCB78023BDBB2012B15D9E9 +S315080034A80020704700EB4310D0F8003923F40013C6 +S315080034B8C0F80039CB78023BDBB2012BF0D8D0F83C +S315080034C8003943F08053C0F80039E9E7D0F8003BE3 +S315080034D843F08053C0F8003BE2E738B50546044692 +S315080034E800220E2A09D804EB42134FF67F31C3F897 +S315080034F80819C3F8081B0132F3E70022C5F8102893 +S31508003508C5F81428C5F81C282846FFF71DFC0346E5 +S3150800351808B1184638BD10212846FFF701FC0346AE +S31508003528F7E7D0F8003823F4FE63C0F80038D0F877 +S315080035380038090101F4FE610B43C0F80038002081 +S31508003548704708B5D0F8043823F00203C0F80438E1 +S315080035580320FDF79DFC002008BD08B5D0F80438FF +S3150800356843F00203C0F804380320FDF791FC002055 +S3150800357808BD4269806910407047D0F8183800F5C8 +S315080035880060C0691840000C7047D0F8183800F574 +S315080035980060C069184080B2704700EB4111D1F845 +S315080035A8082B00F5006040691040704710B4D0F841 +S315080035B81048D0F8343801F00F02D340DB01DBB2EB +S315080035C8234300EB411000F51060806818405DF849 +S315080035D8044B7047406900F001007047D0F800298D +S315080035E8054B1340C0F80039D0F8043843F4807303 +S315080035F8C0F804380020704700F8FFFF10B4046CC0 +S31508003608154B9C4203D9D0F8003B002B16DB002447 +S31508003618C0F8104BD0F8104B44F40024C0F8104BEF +S31508003628D0F8104B44F01804C0F8104BD0F8104BDB +S3150800363844F0C044C0F8104B012903D000205DF8B7 +S31508003648044B7047C0F8142BD0F8003B43F080238E +S31508003658C0F8003BF2E700BF0A30544F084B1A6916 +S3150800366822F440721A611A6942F004021A611A6948 +S3150800367842EA002040F480301861BFF34F8F704744 +S31508003688003C024010B449B1012923D0022902D0CE +S315080036984FF4407203E04FF4007200E000220F4B2B +S315080036A81C6924F440741C61196911431961196964 +S315080036B821F0F80119611A6942EAC00242F00202C9 +S315080036C81A611A6942F480321A61BFF34F8F5DF89E +S315080036D8044B70474FF48072E1E700BF003C024094 +S315080036E8214B1B7D012B3CD070B50E4604461E4B5C +S315080036F801221A754CF25030FEF7D0FB014658BB2A +S315080037084FF0FF3333602368012B16D06568A3682A +S3150800371862681344AB421FD9217B2846FFF7B2FFDC +S315080037284CF25030FEF7BAFB104A136923F07A03B5 +S315080037381361014678B90135E9E7207BFFF78EFF63 +S315080037484CF25030FEF7AAFB0146084A136923F0E3 +S315080037580403136100E03560034B00221A75084616 +S3150800376870BD022108467047600E0020003C0240E2 +S3150800377830B40468606A29B940EA0240A0620020A9 +S3150800378830BC70470D46A36A00EB13400023691E38 +S315080037988B4209D203F1400104EB8101496800EB29 +S315080037A811400133DBB2F2E740EA024005F13F0176 +S315080037B804EB81014860E2E7036859620020704714 +S315080037C8024603680121C0F8FC13002082F8F403B6 +S315080037D89A6942F000629A61596D024A0A435A6523 +S315080037E8704700BF030000107047000012230B80C3 +S315080037F8004870475404002004230B80004870478B +S31508003808680400200023934216D230B40BE03734FC +S3150800381801F8134000015C00013400250D550133F9 +S31508003828DBB2934206D2040F092CF0D8303401F8DB +S315080038381340EFE730BC70477047000038B50A4BAD +S31508003848186804331C6804331B68C01800D138BDCF +S31508003858064D0822A91CFFF7D5FF042205F1120117 +S315080038682046FFF7CFFFF2E720F4F01F6C0400208C +S3150800387808B51A230B80FFF7E1FF014808BD00BF0A +S315080038886C04002008B50A4628B905490548FDF715 +S3150800389808F9034808BD02490248FDF702F9F8E79E +S315080038A87C0E0020E851000810B5044C0A4621464B +S315080038B80348FDF7F6F8204610BD00BF7C0E002029 +S315080038C8D851000808B50A4628B905490548FDF734 +S315080038D8E8F8034808BD02490248FDF7E2F8F8E7A0 +S315080038E87C0E0020B851000808B50A4628B90549CB +S315080038F80548FDF7D6F8034808BD02490248FDF70A +S31508003908D0F8F8E77C0E0020C0510008014B188053 +S31508003918704700BF0A05002008B500F097FE0E4B51 +S315080039281B6898420FD30D4B1B786BB90B4B0122BA +S315080039381A700B4B80229A6100F088FE094B1B8887 +S315080039481844054B186008BD044B00221A70044B2E +S315080039584FF400029A61EFE7100500200C050020D5 +S31508003968000402400A050020024B4FF400029A613F +S31508003978704700BF0004024008B5054B1B6913F4DD +S31508003988005F01D0002008BDFFF7EEFF0120FAE727 +S315080039980008024008B56420FFF7B8FF08BD08B557 +S315080039A8FFF7BAFF08BD70477047704708B5304A31 +S315080039B8136823F00F0343F007031360136803F033 +S315080039C80F03072B4ED12B4B1A6842F440421A6054 +S315080039D81A6842F480321A6003F5E4331A6842F426 +S315080039E880221A601A6842F480321A60224B1B68D1 +S315080039F813F4003FFAD0204B5A6820491140204A50 +S31508003A080A435A605A681F4911401F4A0A435A60AE +S31508003A181A6842F080721A60174B1B6813F0007F09 +S31508003A28FAD0154B9A6822F0F0029A609A6822F43E +S31508003A38E05242F4A0529A609A6822F4604242F42C +S31508003A4800429A609A6822F0030242F002029A60DB +S31508003A58094B9B6803F00C03082BF9D10B48FEF7B2 +S31508003A6825FD08BD6A210A4800F0C0FAABE700BF81 +S31508003A78003C024000700040003802400080BCFF4D +S31508003A88086C40000080BFF0086C400900E6DF0CAF +S31508003A98FC51000808B5FDF7EFF9FFF787FF08BDE1 +S31508003AA808B5FFF7F7FF00F0ADFA00F0B9FAFCE73A +S31508003AB82DE9F04391B04C4C636C43F4804363643E +S31508003AC8636C03F480430993099B236C43F0805382 +S31508003AD82364236C03F080530893089B236B43F0F5 +S31508003AE801032363236B03F001030793079B236BE7 +S31508003AF843F002032363236B03F002030693069B32 +S31508003B08236B43F004032363236B03F00403059331 +S31508003B18059B236B43F008032363236B03F0080311 +S31508003B280493049B236C43F480232364236C03F4D3 +S31508003B3880230393039B236C43F000732364236C4D +S31508003B4803F000730293029B80230A9301230B93C5 +S31508003B5800250C950D950E95DFF89C800AA9404618 +S31508003B68FEF756F84FF40003C8F818304FF4005318 +S31508003B780A930B950E950AA91C48FEF749F84FF4BF +S31508003B884079CDF8289002270B9703260C960D95B1 +S31508003B980E9507230F930AA91548FEF739F8CDF8A5 +S31508003BA828900B970C960D950E9509230F930AA93D +S31508003BB84046FEF72DF84FF4C0530A930B970C9618 +S31508003BC80D950E950A230F930AA90A48FEF720F8B9 +S31508003BD8636B43F080036363636B03F080030193AD +S31508003BE8019B11B0BDE8F083003802400008024086 +S31508003BF8000C0240000002400004024010B5FEF71F +S31508003C08EFFC1B4C4FF40003A3611A48FDF742FF6B +S31508003C181948FDF73FFF2046FDF73CFF1748FDF713 +S31508003C2839FF174B5A6B22F080025A631A6C22F036 +S31508003C3800721A641A6C22F480221A641A6B22F02B +S31508003C4808021A631A6B22F004021A631A6B22F026 +S31508003C5802021A631A6B22F001021A631A6C22F01E +S31508003C6880521A645A6C22F480425A6410BD00BF06 +S31508003C7800040240000C024000080240000002400E +S31508003C88003802402023038000487047C0040020FB +S31508003C980A23038000487047E004002008B590F816 +S31508003CA89C32032B01D0002008BD01F0E3F9FAE79E +S31508003CB808B501F0DFF9002008BD08B5084601F087 +S31508003CC80DFA002008BD000008B50B7813F0600F40 +S31508003CD806D14B780A2B14D00B2B17D0062B01D0FC +S31508003CE8002008BD4B881B0A212B04D00B49172234 +S31508003CF8FCF745FBF4E7CA88172A28BF172208499C +S31508003D08F6E701220749FCF73AFBE9E78B7813B986 +S31508003D18044A1360E4E7FCF78CFBE1E7C9040020D2 +S31508003D28D20400201405002010B50446812100F0AD +S31508003D382DF90121204600F029F9002010BD0000C0 +S31508003D4810B5044640230222812100F014F94023C5 +S31508003D5802220121204600F00EF94023034A0121D8 +S31508003D68204600F03BF9002010BD00BF7C1000205B +S31508003D78004870477C10002008B500F57171D0F826 +S31508003D880004FCF70BFF08BD08B5C1EBC102930098 +S31508003D980344D3F80822D0F80004FCF72CFF08BD22 +S31508003DA808B5C1EBC102930003449A6CD0F8000425 +S31508003DB8FCF75BFF08BD08B5D0F80004FCF7F1FF6F +S31508003DC808BD000010B50446C3684BB1022B01D1E3 +S31508003DD8012106E09121074800F008F9012100E0D1 +S31508003DE80021D4F80004FCF7C5FFD4F80004FCF752 +S31508003DF898FF10BD0452000810B50446D0F8000410 +S31508003E08FCF7BBFF2268D2F8003E43F00103C2F86C +S31508003E18003E236A23B1044A136943F00603136173 +S31508003E28FFF7C2FD10BD00BF00ED00E010B504465F +S31508003E38FFF7BBFDD4F80004FCF7A8FF10BD08B5CA +S31508003E48D0F80004FCF7BDFF08BD08B5D0F8000493 +S31508003E58FCF7B5FF08BD10B504460120FFF7A3FD1A +S31508003E68D4F80004FCF7AFFF10BD10B504460020CF +S31508003E78FFF799FDD4F80004FCF7A7FF10BD00006A +S31508003E8803780BB10020704710B503461748C0F8E9 +S31508003E980034C3F8C4024FF0A04303600623436006 +S31508003EA80222C2600023036182610122C2610362A1 +S31508003EB84362C3620363FDF769F880B90B4C802136 +S31508003EC82046FFF779FC402200212046FFF750FCE0 +S31508003ED8802201212046FFF74BFC002010BD40F246 +S31508003EE82511034800F082F8E8E700BFBC10002057 +S31508003EF804520008D0F8C43211F0800F08D101F036 +S31508003F087F01C1EBC1018A00134493F8FE0170478B +S31508003F1801F07F01C1EBC1018A00134493F83E0002 +S31508003F28704708B5D0F8C402FDF708FD08BD022891 +S31508003F3807D8DFE800F002060400002070470120D1 +S31508003F4870470320704708B5D0F8C402FDF7ECF8A7 +S31508003F58FFF7EDFF08BD08B5D0F8C402FDF7AFF8BE +S31508003F68FFF7E5FF08BD08B5D0F8C402FDF7BCF8A9 +S31508003F78FFF7DDFF08BD10B51C4613462246D0F8E4 +S31508003F88C402FDF737FCFFF7D2FF10BD08B5D0F815 +S31508003F98C402FDF76FFCFFF7CAFF08BD08B5D0F8DD +S31508003FA8C402FDF7FEFCFFF7C2FF08BD08B5D0F846 +S31508003FB8C402FDF737FDFFF7BAFF08BD08B5D0F804 +S31508003FC8C402FDF703FCFFF7B2FF08BD08B5D0F831 +S31508003FD8C402FDF7BCFCFFF7AAFF08BD08B5D0F870 +S31508003FE8C402FDF77DFCFFF7A2FF08BD08B500F07F +S31508003FF805F8FCE708B5FFF7CDFC08BD08B5FFF7D7 +S31508004008CEFC08BD08B500F07BFEFFF7F3FF00F00D +S31508004018FBFA01F08FF800F057F800F049F808BDE8 +S3150800402808B5FFF7EBFF00F003FB00F061F800F0B6 +S3150800403801F808BD08B500F0DFF8012803D00B4BD6 +S315080040481B78012B00D008BD00F000FB084B1B6845 +S31508004058084A1268134403F5FA739842F3D3034BD4 +S3150800406800221A7000F050FEEDE700BF1C0500207C +S315080040781805002020050020014B1860704700BF6E +S3150800408818050020014B1868704700BF180500205E +S3150800409808B5054B1B78012B00D008BD00F0D6FAE9 +S315080040A8024B1860F9E700BF1C0500202005002010 +S315080040B808B5044B01221A70FFF7EAFFFFF7BAFFA3 +S315080040C808BD00BF1C05002010B500F005FA00F071 +S315080040D8B7FB064C0123237000F0EAFA0023237085 +S315080040E800F0FEFE0223237010BD00BFEA0400207C +S315080040F800B583B00DF10701184800F01DFC01282A +S3150800410810D00DF10701154800F008FB012812D058 +S315080041180DF10701114800F061FF012814D003B01A +S315080041285DF804FB0E4B01221A709DF807100B4820 +S3150800413800F0F2F9E5E70A4B00221A709DF8071015 +S31508004148064800F0E9F9E3E7054B02221A709DF8DC +S315080041580710024800F0E0F9E1E700BF240500204F +S31508004168EA04002008B500F0FFFE08BD38B5044685 +S315080041780D460E4B1B78012B09D00C4B1B7853B1F7 +S315080041880A4B1B78022B0BD000F0BEF938BDC9B212 +S3150800419800F0ACFBF1E7E9B2204600F0A3FAEFE736 +S315080041A8E9B2204600F0F0FEEEE700BFEA04002078 +S315080041B8074B1B78022B05D0032B05D0012B05D0FE +S315080041C8402070473F2070470020704708207047F6 +S315080041D8EA040020074B1B78022B05D0032B05D0D1 +S315080041E8012B05D0402070473F20704700207047B4 +S315080041F808207047EA04002008B500F07BF9034652 +S3150800420800B10123184608BD014B00225A707047B1 +S3150800421864050020034BFE22DA7018710222A3F8FF +S31508004228442070476405002010B5054C0023237008 +S31508004238FFF7EAFFFF23E3700123A4F8443010BD13 +S3150800424864050020064BFF22DA7000221A71597895 +S3150800425859719A71DA711A720622A3F844207047BE +S315080042686405002008B50020FFF7D4FF08BD000044 +S31508004278074BFF22DA70074A9A6400221A715A71A4 +S315080042889A710722C3F807200822A3F84420704722 +S315080042986405002010520008044BFF22DA704268B1 +S315080042A89A640122A3F84420704700BF64050020D9 +S315080042B808B53120FFF7AEFF08BD000038B5084C31 +S315080042C8FF23E370002525716571FFF771FFA0715B +S315080042D8E571257265720723A4F8443038BD00BF16 +S315080042E86405002038B5FFF78FFF0E4C01252570A9 +S315080042F8FF23E3701023237100236371FFF758FF28 +S31508004308A071FFF767FFE071FFF764FFC0F30720A6 +S3150800431820726572A5720823A4F8443000F00AFFD3 +S3150800432838BD00BF6405002038B50546FFF740FFCD +S315080043386A7890420FD90A4CA16C201D00F004FD3A +S31508004348FF23E3706A78A36C1344A3646B7801337C +S31508004358A4F8443038BD2220FFF75CFFFAE700BF0F +S315080043686405002038B50446FFF722FF63789842AB +S3150800437811D961680A4DA9646278281D00F0E4FC21 +S31508004388FF23EB706278AB6C1344AB646378013334 +S31508004398A5F8443038BD2220FFF73CFFFAE700BFEE +S315080043A864050020F8B50546174600244E1E39B19F +S315080043B815F8013B1C44E4B2FFF720FE3146F5E741 +S315080043C83C600120F8BD000010B5084CFF23E370D7 +S315080043D8E21D4168A06CFFF7E5FF207100236371B1 +S315080043E8A3710823A4F8443010BD00BF6405002053 +S315080043F838B505460D4B9C6CFFF7DAFE6A1C411E5C +S31508004408204600F09BFE60B1084CFF23E370FFF7D7 +S31508004418CFFE0138A36C0344A3640123A4F84430EF +S3150800442838BD3120FFF7F6FEFAE700BF640500201D +S3150800443810B50446FFF7BCFE01386378984213DDC9 +S31508004448114BFF22DA700122A3F84420617879B16A +S31508004458A21C0D4B986C00F071FE88B161780A4A67 +S31508004468936C0B44936410BD2220FFF7D3FEFAE73A +S3150800447800F074FE0028F6D13120FFF7CBFEF2E7EC +S315080044883120FFF7C7FEEEE76405002008B5416846 +S31508004498074B986C00F056FE30B1054BFF22DA70D0 +S315080044A80122A3F8442008BD3120FFF7B3FEFAE736 +S315080044B86405002008B500F027FC034BFF22DA70D4 +S315080044C80122A3F8442008BD6405002008B589B26E +S315080044D8FFF74CFE08BD0000054B00221A709A64C7 +S315080044E883F84320A3F844209A705A70704700BF8F +S315080044F864050020034B1B780BB101207047002088 +S31508004508704700BF64050020024B002283F8432049 +S31508004518704700BF6405002008B50378FF2B23D031 +S31508004528354A1278012A2BD1C93B352B53D8DFE8EF +S3150800453803F04052524F52524C4349465252525235 +S315080045485252525252525252525252525252525235 +S31508004558525252525252525252525252312B282EBB +S315080045685252523452373A3DFFF7BCFE224B93F863 +S315080045784330012B33D0204BB3F94410002932DCE1 +S3150800458808BDFFF7D1FEF1E7FFF7ECFEEEE7FFF708 +S3150800459883FEEBE7FFF718FFE8E7FFF769FEE5E7AD +S315080045A8FFF760FEE2E7FFF74DFEDFE7FFF73CFEA1 +S315080045B8DCE7FFF71DFFD9E7FFF73AFFD6E7FFF76E +S315080045C87DFED3E7FFF762FFD0E7FFF773FFCDE776 +S315080045D8FFF76EFECAE72020FFF71CFEC6E7102085 +S315080045E8FFF718FEC7E71846012380F8433003305B +S315080045F8FFF76CFFC4E700BF64050020014B0022E3 +S315080046081A60704710E000E008B5FFF7F7FF054B9A +S31508004618054A5A6000229A6005211960034B1A60F8 +S3150800462808BD00BF10E000E0BF4B0300B00500203E +S31508004638044B1B6813F4803F03D0034A13680133FD +S315080046481360704710E000E0B005002008B5FFF7D2 +S31508004658EFFF014B186808BDB005002008B5FFF73D +S31508004668F5FF08BD70470000054BDB6913F0200FFE +S3150800467804D0034B5B6A037001207047002070471B +S315080046880048004010B5094B9862FFF7DFFF00F1B4 +S315080046980A04064BDB6913F0800F05D1FFF7AEFC59 +S315080046A8FFF7D4FFA042F4D910BD00BF0048004068 +S315080046B810B588B04FF4614301930023029303931E +S315080046C804930C22059206930793054C01A92046E4 +S315080046D8FDF7F2FE236843F00103236008B010BD16 +S315080046E80048004070B506460D4640290ED82846AB +S315080046F8FFF7C8FF0024ABB2A3420CD9FFF77EFC2C +S31508004708305DFFF7BFFF0134A4B2F4E78121024800 +S31508004718FFF76CFCEBE770BD1852000870B5254B1F +S315080047281C78BCB92448FFF79FFF012801D020460A +S3150800473870BD214B1B78013BDBB23F2BF7D8FFF73F +S3150800474885FF1E4B18601E4B00221A70194B012252 +S315080047581A70ECE706460D46194B1B7801331648BE +S315080047681844FFF781FF0446012815D1144B1A7817 +S315080047780132D2B21A70104B1B789A4201D0002423 +S31508004788D5E71049304600F0DFFA0A4B00221A70BE +S315080047980B4B1B782B70CAE7FFF758FF074B1B68AC +S315080047A86433984203D90024024B1C70BFE70024DF +S315080047B8BDE700BFF5050020B4050020F805002070 +S315080047C8F6050020B50500202DE9F04184B0044619 +S315080047D80D46174698466846FDF7AAFF0299164BEE +S315080047E8A3FB01318909002201E00132D2B2112A5C +S315080047F81DD8124B13F8120003EB420393F801C0B5 +S3150800480800EB0C0303FB0443B1FBF3FE03FB1E1684 +S31508004818002EEAD11FFA8EF32B80013B9BB2B3F523 +S31508004828806FE2D2387088F800C0012000E00020C6 +S3150800483804B0BDE8F08100BFD34D62106852000885 +S3150800484870B58CB00023ADF82E308DF82D308DF864 +S315080048582C300BAB0DF12D020DF12E014FF4FA7029 +S31508004868FFF7B2FF002835D01D4C1E4B23600025E4 +S3150800487825766576A5760126E67625776577A56091 +S31508004888E5609DF82D30013B1B0423619DF82C300B +S31508004898013B1B056361BDF82E3063602046FDF7B2 +S315080048A878FB0695079508964CF6E043019302951A +S315080048B84FF6E073039304230493059509960E238C +S315080048C80A9301A92046FDF70BFC2046FDF79EFC36 +S315080048D80CB070BDB5210448FFF788FBC4E700BFD4 +S315080048E8FC050020006400404052000810B588B056 +S315080048F840F2E1730293002304930593069101ABF2 +S31508004908024602A90B48FDF7AFFC08B108B010BD6E +S31508004918FFF79CFE00F1320401990648FDF71AFDD7 +S315080049280028F3D0FFF76AFBFFF790FEA042F3D9F9 +S31508004938ECE700BFFC05002010B588B00C46034616 +S3150800494801AA00210A48FDF717FD60B9019A40F245 +S3150800495867639A4201D0002006E0039B33B9059B9A +S315080049682370012000E0002008B010BD0020FBE7F6 +S31508004978FC05002038B50546002401E00134E4B2F8 +S31508004988062C15D8FFF73AFB04EB44029300094AAC +S31508004998D358AB42F2D804EB44029100054A0A44BC +S315080049A852681344AB42E9D9024B0B44187A00E023 +S315080049B8FF2038BD8C52000808B5C1F3080353B95F +S315080049C803688B4209D040F8041B4FF4007200F0C4 +S315080049D8BBF9012008BD0020FCE70120FAE72DE90C +S315080049E8F0410746FDF738FA002400E001347F2C29 +S315080049F814D83E68A30006EB03083B445D68FFF736 +S31508004A08FDFA2A46002341460220FDF779FA38B905 +S31508004A1856F82430AB42E9D0002402E0012400E02D +S31508004A280024FDF731FA2046BDE8F08138B50D4671 +S31508004A380C4B984211D004460B4B994207D1094CA6 +S31508004A4829462046FFF7B8FF48B1204638BDFFF784 +S31508004A58C6FF0028F4D10024F7E7044CF0E7002441 +S31508004A68F3E700BF28080020008000082406002075 +S31508004A782DE9F04106460C4617461D46DFF87480B0 +S31508004A8801EA08080368B3F1FF3F07D033684345CE +S31508004A980BD13368E41A3444043415E04146FFF769 +S31508004AA88BFF03460028F1D11FE041463046FFF741 +S31508004AB8BDFF06460028ECD1002316E017F8013B8F +S31508004AC804F8013B013D0FD0FFF798FA331DE31AA6 +S31508004AD8B3F5007FF2D308F500713046FFF7A6FF55 +S31508004AE8064628B1041DE9E701231846BDE8F08102 +S31508004AF80023FAE700FEFFFF70B586B004460E46A7 +S31508004B0800230193884219D80125ECB1072E1FD82E +S31508004B18DDB1002302930223059301230493FDF7CD +S31508004B289BF9B4420DD8FFF769FA039401A902A8BC +S31508004B38FEF7D6FD20B90134E4B2F2E70025E4E72A +S31508004B480025FDF7A1F900E00025284606B070BD46 +S31508004B580025FAE74FF0FF33024A1360024A13604A +S31508004B68704700BF240600202808002070B54B1E91 +S31508004B78134C241AA34201D9002070BD16460D46C7 +S31508004B880446FFF7F7FEFF2811D028190138FFF762 +S31508004B98F1FEFF280BD00B4B23400B4A934208D053 +S31508004BA82B46324621460948FFF762FFE5E700200B +S31508004BB8E3E72B46324621460548FFF759FFDCE767 +S31508004BC8FFFF0F0800FEFFFF0080000824060020EC +S31508004BD8280800204A1E0D4B1B1A9A4201D90020A4 +S31508004BE8704770B50C460546FFF7C4FE06466019B9 +S31508004BF80138FFF7BFFEFF2818BFFF2E01D1002096 +S31508004C0870BD01463046FFF777FFF9E7FFFF0F0843 +S31508004C18104B1B68B3F1FF3F19D000B583B00D4A96 +S31508004C28536891680B44D1680B4411690B44516960 +S31508004C380B4491690B44D26913445B42019301AA58 +S31508004C4804210548FFF792FF03B05DF804FB01202D +S31508004C58704700BF28080020C88100080D4B1B684C +S31508004C680D4A12681A440D4B1B6813440C4A1268FD +S31508004C7813440C4A12681A440B4B1B681A440B4B0C +S31508004C881B6813440A4A1268DA4201D000207047A2 +S31508004C980120704700800008048000080880000882 +S31508004CA80C80000810800008148000081880000886 +S31508004CB8C881000808B50E4B1B68B3F1FF3F07D13A +S31508004CC80C4B1B68B3F1FF3F09D10123184608BDF1 +S31508004CD80748FFF784FE03460028F1D1F6E705489A +S31508004CE8FFF77DFE03460028F0D00123EEE700BF54 +S31508004CF8280800202406002000487047008000087D +S31508004D0808B500F036FA08BD10B500F01FFA00B964 +S31508004D1810BDFEF731FE0028FAD0FFF723FAFFF791 +S31508004D286DFCFCF76DF800F015FA054B0340054ACB +S31508004D38936000F00FFA446800F01DFAA047E7E709 +S31508004D4880FFFF1F00ED00E070B50D460446531EB0 +S31508004D589EB23AB115F8013B04F8013BFFF74EF944 +S31508004D683246F4E770BD0000094B03F1180100222A +S31508004D7832B19A7400225A61064B054A1A6070477E +S31508004D889A745961183318310132D2B2F0E700BF64 +S31508004D986C0A00209C0A00200A4B1B6883B110B4D1 +S31508004DA85C69084A146019749860D86000225A74B5 +S31508004DB81860013908445860987C5DF8044B7047B8 +S31508004DC8FF2070479C0A002038B504460D4601287E +S31508004DD81CD862002244D100114B0B445A7C1B7C18 +S31508004DE89A4219D00E4B0B44DA6815705A7C013270 +S31508004DF85A74DA680132DA605B689A420ED9084A48 +S31508004E08084651580244D160012038BD4FF4E07174 +S31508004E180448FFF7EBF8DCE70020F6E70120F4E79B +S31508004E286C0A0020E052000808B50146024B1878BB +S31508004E38FFF7CAFF08BD00BFA00A002038B5044618 +S31508004E480D4601281ED804EB4403DA00124B134416 +S31508004E585B7CEBB162002244D1000F4B0B449A6885 +S31508004E6812782A705A7C013A5A749A6801329A60FA +S31508004E785B689A420ED9084A084651580244916016 +S31508004E88012006E04FF4F1710448FFF7AFF8DAE7B6 +S31508004E98002038BD0120FCE76C0A0020E052000813 +S31508004EA808B50146024B1878FFF7C8FF08BD00BFCA +S31508004EB8E40A002010B50446012806D804EB440481 +S31508004EC8E200054B1344587C10BD40F20221034802 +S31508004ED8FFF78CF8F2E700BF6C0A0020E0520008DA +S31508004EE838B5FFF741FF1A4C4021601CFFF754FFFD +S31508004EF82070184D4021681CFFF74EFF287023784C +S31508004F08FF2B1BD0FF2819D0134C00221349204623 +S31508004F18FBF7E2FD12492046FBF717FE0120FEF7CC +S31508004F2842FD2046FBF725FED4F8C402FCF72AFC06 +S31508004F38FFF7A8F8B0F5FA6F05D338BD85210948F3 +S31508004F48FFF754F8E0E74FF4FA60FFF795F8F4E747 +S31508004F58A00A0020E40A0020280B002038040020B4 +S31508004F6888040020E052000810B5064CD4F8C4029C +S31508004F78FCF71AFC2046FBF7CBFD0020FEF713FDCD +S31508004F8810BD00BF280B002070B506460D463F2900 +S31508004F9806D82846FFF748FF012806D100240FE05F +S31508004FA8B9210D48FFF722F8F3E7BD210A48FFF7AC +S31508004FB81DF8F3E7C6210848FFF718F80134A4B224 +S31508004FC8ABB2A34207D9FFF719F8305DFFF72CFFF4 +S31508004FD80128F3D0EEE770BDE052000870B5064622 +S31508004FE80D461F4BD3F8C402FCF758F91D4B1C781D +S31508004FF89CB91D48FFF754FF012801D0204670BD0B +S31508005008194B1B78013BDBB23E2BF7D8154B01220F +S315080050181A70164B00221A70F0E7144B1B780133E6 +S3150800502811481844FFF73CFF0446012801D000241C +S31508005038E4E70E4B1A780132D2B21A700A4B1B787B +S315080050489A4201D00024D9E709493046FFF77CFE81 +S31508005058044B00221A70054B1B782B70CEE700BF4D +S31508005068280B0020380E0020F80D0020390E0020E5 +S31508005078F90D002030B583B0144B1878FFF71AFFDE +S3150800508808B30546402800D9402500240AE04FF40D +S31508005098A3710F48FEF7AAFF9DF807200D4B1A556E +S315080050A80134E4B2A54208D90DF10701074B18786F +S315080050B8FFF7C4FE0128EFD0E9E72B46054A812108 +S315080050C80548FEF783FF03B030BD00BFA00A0020DD +S315080050D8E05200082C0A0020280B002070B5044668 +S315080050E8FEF746FE064621460F48FEF71AFF85B222 +S315080050F8002406E04FF4B4710C48FEF777FF013434 +S31508005108A4B2AC4207D2315D094B1878FFF75CFEAA +S315080051180128F4D0EEE7FEF72BFE402302460121CC +S315080051280148FEF75BFF70BD280B0020E052000817 +S31508005138E40A002008B5FFF70DFD08BD08B5FFF716 +S3150800514815FD08BD08B5FFF745FD08BD08B5FFF705 +S3150800515885FD08BD08B5FFF7CFFD08BD08B5FFF7FB +S3150800516857FD034608B9184608BDFFF7A3FD0346C9 +S31508005178F9E772B6704762B670470000F8B500BF1F +S31508005188F8BC08BC9E467047F8B500BFF8BC08BC12 +S309080051989E4670476A +S3150800519C00000020000000000000000001020304CB +S315080051AC060708090000000001020304446566614D +S315080051BC756C740057696E5553422042756C6B209A +S315080051CC496E746572666163650000004F70656EA2 +S315080051DC424C5420557365720000000057696E5591 +S315080051EC53422042756C6B204465766963650000F2 +S315080051FC6D61696E2E630000757362645F636F6E12 +S3150800520C662E63004F70656E424C54002E2E2F2E60 +S3150800521C2E2F2E2E2F536F757263652F41524D43C9 +S3150800522C4D375F53544D333246372F727332333200 +S3150800523C2E6300002E2E2F2E2E2F2E2E2F536F75EB +S3150800524C7263652F41524D434D375F53544D33327C +S3150800525C46372F63616E2E630000000005020602B6 +S3150800526C060307030803090309040A040B040C04C0 +S3150800527C0C050D050E050F050F0610061007100870 +S3150800528C00800008008000000100000000000108F2 +S3150800529C0080000002000000008001080080000069 +S315080052AC03000000000002080000020004000000D1 +S315080052BC00000408000004000500000000000808AF +S315080052CC000004000600000000000C0800000400A2 +S315080052DC070000002E2E2F2E2E2F2E2E2F536F75D5 +S315080052EC7263652F41524D434D375F53544D3332DC +S311080052FC46372F7573622E630000000011 +S30D0800530851020008ED0100083E +S30908005310C9010008B9 +S3150800531400000000EC02002054030020BC03002017 +S31508005324000000000000000000000000000000006B +S31508005334000000000000000000000000000000005B +S31508005344000000000000000000000000000000004B +S31508005354000000000000000000000000000000003B +S31508005364000000000000000000000000000000002B +S31508005374000000000000000000000000000000001B +S31508005384000000000000000000000000000000000B +S3150800539400000000000000000000000000000000FB +S315080053A400000000000000000000000000000000EB +S315080053B400000000000000000100000000000000DA +S315080053C40E33CDAB34126DE6ECDE05000B0000009F +S315080053D400000000000000000000000000000000BB +S315080053E400000000000000000000000000000000AB +S315080053F4000000000000000000000000000000009B +S31508005404000000000000000000000000000000008A +S31508005414000000000000000000000000000000007A +S31508005424000000000000000000000000000000006A +S31508005434000000000000000000000000000000005A +S31508005444000000000000000000000000000000004A +S31508005454000000000000000000000000000000003A +S31508005464000000000000000000000000000000002A +S31508005474000000000000000000000000000000001A +S31508005484000000000000000000000000000000000A +S3150800549400000000000000000000000000000000FA +S315080054A400000000000000000000000000000000EA +S315080054B400000000000000000000000000000000DA +S315080054C400000000000000000000000000000000CA +S315080054D400000000000000000000000000000000BA +S315080054E400000000000000000000000000000000AA +S315080054F4000000000000000000000000000000009A +S315080055040000000000000000000000000000000089 +S315080055140000000000000000000000000000000079 +S315080055240000000000000000000000000000000069 +S315080055340000000000000000000000000000000059 +S315080055440000000000000000000000000000000049 +S315080055540000000000000000000000000000000039 +S315080055640000000000000000000000000000000029 +S315080055740000000000000000000000000000000019 +S315080055840000000000000000000000000000000009 +S3150800559400000000000000000000000000000000F9 +S315080055A400000000000000000000000000000000E9 +S315080055B400000000000000000000000000000000D9 +S315080055C400000000000000000000000000000000C9 +S315080055D400000000000000000000000000000000B9 +S315080055E400000000000000000000000000000000A9 +S315080055F40000000000000000000000000000000099 +S315080056040000000000000000000000000000000088 +S315080056140000000000000000000000000000000078 +S315080056240000000000000000000000000000000068 +S315080056340000000000000000000000000000000058 +S315080056440000000000000000000000000000000048 +S315080056540000000000000000000000000000000038 +S315080056640000000000000000000000000000000028 +S315080056740000000000000000000000000000000018 +S315080056840000000000000000000000000000000008 +S3150800569400000000000000000000000000000000F8 +S315080056A400000000000000000000000000000000E8 +S315080056B400000000000000000000000000000000D8 +S315080056C400000000000000000000000000000000C8 +S315080056D400000000000000000000000000000000B8 +S315080056E400000000000000000000000000000000A8 +S315080056F40000000000000000000000000000000098 +S315080057040000000000000000000000000000000087 +S315080057140000000000000000000000000000000077 +S315080057240000000000000000000000000000000067 +S3150800573400000000000000003C0E00200024F400D5 +S315080057440100000010000000F537000801380008C1 +S31508005754B13800088D38000879380008CD380008B3 +S31508005764F13800081201000200000040501DAC6028 +S315080057740002010203010000040309041A030000DD +S315080057840000000000000000000000000000000007 +S315080057940000000000000000493D0008313D0008F3 +S315080057A4D13C00080000000000000000B93C0008D5 +S315080057B4C33C0008A53C00080000000000000000E7 +S315080057C4000000008D3C000800000000993C000819 +S315080057D409022000010100C0320904000002FF008A +S315080057E40000070581024000FF070501024000FF8B +S311080057F40A060002000000400100040044 S70508000335BA diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h index 5de6c6e1..2c47d3f0 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h @@ -12,29 +12,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h index 0633bb22..2650b739 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h @@ -96,16 +96,16 @@ typedef struct __PCD_HandleTypeDef typedef struct #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ { - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ uint32_t BESL; @@ -148,9 +148,9 @@ typedef struct /** @defgroup PCD_Speed PCD Speed * @{ */ -#define PCD_SPEED_HIGH 0U -#define PCD_SPEED_HIGH_IN_FULL 1U -#define PCD_SPEED_FULL 2U +#define PCD_SPEED_HIGH USBD_HS_SPEED +#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED +#define PCD_SPEED_FULL USBD_FS_SPEED /** * @} */ @@ -207,20 +207,20 @@ typedef struct #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ } while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ } while(0U) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -256,7 +256,7 @@ typedef enum HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ @@ -371,14 +371,6 @@ PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); * @{ */ #if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - #define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ #define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h index f151a3d3..9bbccb71 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h @@ -42,13 +42,6 @@ extern "C" { /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_LL_Private_Constants USART Private Constants - * @{ - */ -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ #if defined(USE_FULL_LL_DRIVER) /** @defgroup USART_LL_Private_Macros USART Private Macros @@ -156,18 +149,21 @@ typedef struct */ #define LL_USART_ICR_PECF USART_ICR_PECF /*!< Parity error flag */ #define LL_USART_ICR_FECF USART_ICR_FECF /*!< Framing error flag */ -#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ +#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ #define LL_USART_ICR_ORECF USART_ICR_ORECF /*!< Overrun error flag */ #define LL_USART_ICR_IDLECF USART_ICR_IDLECF /*!< Idle line detected flag */ #define LL_USART_ICR_TCCF USART_ICR_TCCF /*!< Transmission complete flag */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ICR_TCBGTCF USART_ICR_TCBGTCF /*!< Transmission completed before guard time flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ #define LL_USART_ICR_LBDCF USART_ICR_LBDCF /*!< LIN break detection flag */ #define LL_USART_ICR_CTSCF USART_ICR_CTSCF /*!< CTS flag */ #define LL_USART_ICR_RTOCF USART_ICR_RTOCF /*!< Receiver timeout flag */ #define LL_USART_ICR_EOBCF USART_ICR_EOBCF /*!< End of block flag */ #define LL_USART_ICR_CMCF USART_ICR_CMCF /*!< Character match flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ICR_WUCF USART_ICR_WUCF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ /** * @} */ @@ -195,10 +191,16 @@ typedef struct #define LL_USART_ISR_CMF USART_ISR_CMF /*!< Character match flag */ #define LL_USART_ISR_SBKF USART_ISR_SBKF /*!< Send break flag */ #define LL_USART_ISR_RWU USART_ISR_RWU /*!< Receiver wakeup from Mute mode flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ISR_WUF USART_ISR_WUF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ #define LL_USART_ISR_TEACK USART_ISR_TEACK /*!< Transmit enable acknowledge flag */ +#if defined(USART_ISR_REACK) +#define LL_USART_ISR_REACK USART_ISR_REACK /*!< Receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ISR_TCBGT USART_ISR_TCBGT /*!< Transmission complete before guard time completion flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -218,9 +220,12 @@ typedef struct #define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ #define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ #define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +#if defined(USART_CR1_UESM) +#define LL_USART_CR3_WUFIE USART_CR3_WUFIE /*!< Wakeup from Stop mode interrupt enable */ +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_CR3_TCBGTIE USART_CR3_TCBGTIE /*!< Transmission complete before guard time interrupt enable */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -400,6 +405,18 @@ typedef struct * @} */ +#if defined(USART_CR1_UESM) +/** @defgroup USART_LL_EC_WAKEUP_ON Wakeup Activation + * @{ + */ +#define LL_USART_WAKEUP_ON_ADDRESS 0x00000000U /*!< Wake up active on address match */ +#define LL_USART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< Wake up active on Start bit detection */ +#define LL_USART_WAKEUP_ON_RXNE (USART_CR3_WUS_0 | USART_CR3_WUS_1) /*!< Wake up active on RXNE */ +/** + * @} + */ + +#endif /* USART_CR1_UESM */ /** @defgroup USART_LL_EC_IRDA_POWER IrDA Power * @{ */ @@ -480,7 +497,8 @@ typedef struct * @param __BAUDRATE__ Baud rate value to achieve * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case */ -#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U) + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U)\ + + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) /** * @brief Compute USARTDIV value according to Peripheral Clock and @@ -545,6 +563,87 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief USART enabled in STOP Mode. + * @note When this function is enabled, USART is able to wake up the MCU from Stop mode, provided that + * USART clock selection is HSI or LSE in RCC. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_EnableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief USART disabled in STOP Mode. + * @note When this function is disabled, USART is not able to wake up the MCU from Stop mode + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_DisableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief Indicate if USART is enabled in STOP Mode (able to wake up MCU from Stop mode or not) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_IsEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledInStopMode(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR1, USART_CR1_UESM) == (USART_CR1_UESM)) ? 1UL : 0UL); +} + +#if defined(USART_CR3_UCESM) +/** + * @brief USART Clock enabled in STOP Mode + * @note When this function is called, USART Clock is enabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_EnableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableClockInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief USART clock disabled in STOP Mode + * @note When this function is called, USART Clock is disabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_DisableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableClockInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief Indicate if USART clock is enabled in STOP Mode + * @rmtoll CR3 UCESM LL_USART_IsClockEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsClockEnabledInStopMode(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_UCESM) == (USART_CR3_UCESM)); +} + +#endif /* USART_CR3_UCESM */ +#endif /* USART_CR1_UESM*/ /** * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) * @rmtoll CR1 RE LL_USART_EnableDirectionRx @@ -1461,6 +1560,41 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_OVRDIS) != USART_CR3_OVRDIS) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Select event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_SetWKUPType + * @param USARTx USART Instance + * @param Type This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWKUPType(USART_TypeDef *USARTx, uint32_t Type) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_WUS, Type); +} + +/** + * @brief Return event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_GetWKUPType + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + */ +__STATIC_INLINE uint32_t LL_USART_GetWKUPType(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_WUS)); +} + +#endif /* USART_CR1_UESM */ /** * @brief Configure USART BRR register for achieving expected Baud Rate value. * @note Compute and set USARTDIV value in BRR Register (full BRR content) @@ -1480,7 +1614,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) __STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate) { - register uint32_t usartdiv; + uint32_t usartdiv; register uint32_t brrtemp; if (OverSampling == LL_USART_OVERSAMPLING_8) @@ -2161,7 +2295,8 @@ __STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) { /* In Asynchronous mode, the following bits must be kept cleared: - LINEN, CLKEN bits in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); } @@ -2197,7 +2332,8 @@ __STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) { /* In Synchronous mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); /* set the UART/USART in Synchronous mode */ @@ -2237,7 +2373,8 @@ __STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) { /* In LIN mode, the following bits must be kept cleared: - STOP and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); /* Set the UART/USART in LIN mode */ @@ -2275,7 +2412,8 @@ __STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) { /* In Half Duplex mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ + - SCEN and IREN bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); /* set the UART/USART in Half Duplex mode */ @@ -2315,7 +2453,8 @@ __STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) { /* In Smartcard mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - IREN and HDSEL bits in the USART_CR3 register.*/ + - IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); /* Configure Stop bits to 1.5 bits */ @@ -2358,7 +2497,8 @@ __STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) { /* In IRDA mode, the following bits must be kept cleared: - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ + - SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); /* set the UART/USART in IRDA mode */ @@ -2396,7 +2536,8 @@ __STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) { /* In Multi Processor mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); } @@ -2630,6 +2771,21 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_RWU) == (USART_ISR_RWU)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from stop mode Flag is set or not + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ISR WUF LL_USART_IsActiveFlag_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_WUF) == (USART_ISR_WUF)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ /** * @brief Check if the USART Transmit Enable Acknowledge Flag is set or not * @rmtoll ISR TEACK LL_USART_IsActiveFlag_TEACK @@ -2641,6 +2797,19 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TEACK(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_TEACK) == (USART_ISR_TEACK)) ? 1UL : 0UL); } +#if defined(USART_ISR_REACK) +/** + * @brief Check if the USART Receive Enable Acknowledge Flag is set or not + * @rmtoll ISR REACK LL_USART_IsActiveFlag_REACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_REACK(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_REACK) == (USART_ISR_REACK)) ? 1UL : 0UL); +} + +#endif/* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2653,8 +2822,8 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->ISR, USART_ISR_TCBGT) == (USART_ISR_TCBGT)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear Parity Error Flag * @rmtoll ICR PECF LL_USART_ClearFlag_PE @@ -2733,7 +2902,7 @@ __STATIC_INLINE void LL_USART_ClearFlag_TCBGT(USART_TypeDef *USARTx) { WRITE_REG(USARTx->ICR, USART_ICR_TCBGTCF); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear LIN Break Detection Flag @@ -2796,6 +2965,21 @@ __STATIC_INLINE void LL_USART_ClearFlag_CM(USART_TypeDef *USARTx) WRITE_REG(USARTx->ICR, USART_ICR_CMCF); } +#if defined(USART_CR1_UESM) +/** + * @brief Clear Wake Up from stop mode Flag + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ICR WUCF LL_USART_ClearFlag_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_WKUP(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->ICR, USART_ICR_WUCF); +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2935,6 +3119,21 @@ __STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) SET_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Enable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_EnableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_WKUP(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2949,7 +3148,7 @@ __STATIC_INLINE void LL_USART_EnableIT_TCBGT(USART_TypeDef *USARTx) { SET_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Disable IDLE Interrupt @@ -3082,6 +3281,21 @@ __STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Disable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_DisableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_WKUP(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3096,7 +3310,7 @@ __STATIC_INLINE void LL_USART_DisableIT_TCBGT(USART_TypeDef *USARTx) { CLEAR_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Check if the USART IDLE Interrupt source is enabled or disabled. @@ -3225,6 +3439,21 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from Stop Mode Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_IsEnabledIT_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR3, USART_CR3_WUFIE) == (USART_CR3_WUFIE)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3239,7 +3468,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->CR3, USART_CR3_TCBGTIE) == (USART_CR3_TCBGTIE)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} @@ -3365,12 +3594,12 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t if (Direction == LL_USART_DMA_REG_DATA_TRANSMIT) { /* return address of TDR register */ - data_reg_addr = (uint32_t) & (USARTx->TDR); + data_reg_addr = (uint32_t) &(USARTx->TDR); } else { /* return address of RDR register */ - data_reg_addr = (uint32_t) & (USARTx->RDR); + data_reg_addr = (uint32_t) &(USARTx->RDR); } return data_reg_addr; @@ -3392,7 +3621,7 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t */ __STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) { - return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR)); + return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR) & 0xFFU); } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h index 1f768abf..44bf4853 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h @@ -155,7 +155,7 @@ typedef struct typedef struct { - uint8_t dev_addr ; /*!< USB device address. + uint8_t dev_addr; /*!< USB device address. This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ uint8_t ch_num; /*!< Host channel number. @@ -199,10 +199,10 @@ typedef struct uint32_t ErrCnt; /*!< Host channel error count.*/ - USB_OTG_URBStateTypeDef urb_state; /*!< URB state. + USB_OTG_URBStateTypeDef urb_state; /*!< URB state. This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ - USB_OTG_HCStateTypeDef state; /*!< Host Channel state. + USB_OTG_HCStateTypeDef state; /*!< Host Channel state. This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ } USB_OTG_HCTypeDef; #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -234,6 +234,18 @@ typedef struct * @} */ +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_HS_SPEED 0U +#define USBD_HSINFS_SPEED 1U +#define USBH_HS_SPEED 0U +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + /** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed * @{ */ @@ -252,7 +264,7 @@ typedef struct #define USB_OTG_HS_EMBEDDED_PHY 3U #if !defined (USB_HS_PHYC_TUNE_VALUE) -#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ +#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ #endif /* USB_HS_PHYC_TUNE_VALUE */ /** * @} @@ -262,11 +274,11 @@ typedef struct * @{ */ #ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U +#define USBD_HS_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ #ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ /** * @} @@ -275,9 +287,9 @@ typedef struct /** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS * @{ */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U +#define USB_OTG_HS_MAX_PACKET_SIZE 512U +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U /** * @} */ @@ -287,7 +299,6 @@ typedef struct */ #define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) #define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_LS_PHY_6MHZ (2U << 1) #define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) /** * @} @@ -397,7 +408,7 @@ typedef struct #define USBPHYC ((USBPHYC_GlobalTypeDef *)((uint32_t )USB_PHY_HS_CONTROLLER_BASE)) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#define EP_ADDR_MSK 0xFU +#define EP_ADDR_MSK 0xFU /** * @} */ @@ -462,13 +473,9 @@ HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state); uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx); uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c index 2b4a5eff..ea532df6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c @@ -122,6 +122,7 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint */ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) { + USB_OTG_GlobalTypeDef *USBx; uint8_t i; /* Check the PCD handle allocation */ @@ -133,6 +134,8 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) /* Check the parameters */ assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + USBx = hpcd->Instance; + if (hpcd->State == HAL_PCD_STATE_RESET) { /* Allocate lock resource and initialize it */ @@ -166,6 +169,12 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) hpcd->State = HAL_PCD_STATE_BUSY; + /* Disable DMA mode for FS instance */ + if ((USBx->CID & (0x1U << 8)) == 0U) + { + hpcd->Init.dma_enable = 0U; + } + /* Disable the Interrupts */ __HAL_PCD_DISABLE(hpcd); @@ -943,7 +952,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i, ep_intr, epint, epnum = 0U; + uint32_t i, ep_intr, epint, epnum; uint32_t fifoemptymsk, temp; USB_OTG_EPTypeDef *ep; @@ -962,6 +971,38 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); } + /* Handle RxQLevel Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + temp = USBx->GRXSTSP; + + ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(USBx, ep->xfer_buff, + (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + else + { + /* ... */ + } + USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) { epnum = 0U; @@ -983,9 +1024,9 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); /* Class B setup phase done for previous decoded setup */ (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) @@ -996,10 +1037,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Clear Status Phase Received interrupt */ if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) { - if (hpcd->Init.dma_enable == 1U) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); } @@ -1037,16 +1074,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if (hpcd->Init.dma_enable == 1U) { hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - } -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if (hpcd->Init.dma_enable == 1U) - { /* this is ZLP, so prepare EP0 for next setup */ if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) { @@ -1054,6 +1082,12 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) { @@ -1159,8 +1193,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USBx_INEP(i)->DIEPINT = 0xFB7FU; USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_INEP(i)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; USBx_OUTEP(i)->DOEPINT = 0xFB7FU; USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; } USBx_DEVICE->DAINTMSK |= 0x10001U; @@ -1217,38 +1253,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); } - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - temp = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; - - if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - /* Handle SOF Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) { @@ -1264,6 +1268,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO IN Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) { + /* Keep application checking the corresponding Iso IN endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1276,6 +1284,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO OUT Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) { + /* Keep application checking the corresponding Iso OUT endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1955,16 +1967,6 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint { CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ { @@ -1987,17 +1989,16 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket; -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) { /* this is ZLP, so prepare EP0 for next setup */ (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } } else @@ -2030,6 +2031,12 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint } else { + if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) + { + /* this is ZLP, so prepare EP0 for next setup */ + (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); + } + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); #else @@ -2055,22 +2062,10 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U); uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - if (hpcd->Init.dma_enable == 1U) + if ((gSNPSiD > USB_OTG_CORE_ID_300A) && + ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) { - /* StupPktRcvd = 1 pending setup packet int */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else - { - if ((gSNPSiD == USB_OTG_CORE_ID_310A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } /* Inform the upper layer that a setup packet is available */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c index 987e5bef..0f04752c 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c @@ -220,9 +220,6 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru if (currentpin) { - /* Pin Mode configuration */ - LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) { /* Check Speed mode parameters */ @@ -230,6 +227,12 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru /* Speed mode configuration */ LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); } /* Pull-up Pull down resistor configuration*/ @@ -250,19 +253,11 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); } } + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); } pinpos++; } - - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) - { - /* Check Output mode parameters */ - assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); - - /* Output mode configuration*/ - LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); - - } return (SUCCESS); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c index 0197818f..588d0bb5 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c @@ -163,7 +163,7 @@ uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void); */ ErrorStatus LL_RCC_DeInit(void) { - uint32_t vl_mask = 0xFFFFFFFFU; + __IO uint32_t vl_mask; /* Set HSION bit */ LL_RCC_HSI_Enable(); @@ -175,10 +175,13 @@ ErrorStatus LL_RCC_DeInit(void) /* Reset CFGR register */ LL_RCC_WriteReg(CFGR, 0x00000000U); + /* Read CR register */ + vl_mask = LL_RCC_ReadReg(CR); + /* Reset HSEON, HSEBYP, PLLON, CSSON, PLLI2SON and PLLSAION bits */ CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_PLLSAION | RCC_CR_PLLI2SON)); - /* Write new mask in CR register */ + /* Write new value in CR register */ LL_RCC_WriteReg(CR, vl_mask); /* Set HSITRIM bits to the reset value*/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c index 2f82ef49..b3db0e6a 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c @@ -22,11 +22,11 @@ #include "stm32f7xx_ll_usart.h" #include "stm32f7xx_ll_rcc.h" #include "stm32f7xx_ll_bus.h" -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else #define assert_param(expr) ((void)0U) -#endif +#endif /* USE_FULL_ASSERT */ /** @addtogroup STM32F7xx_LL_Driver * @{ @@ -41,14 +41,6 @@ /* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @addtogroup USART_LL_Private_Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ /** @addtogroup USART_LL_Private_Macros * @{ @@ -65,42 +57,42 @@ #define IS_LL_USART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ - || ((__VALUE__) == LL_USART_DIRECTION_RX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ - || ((__VALUE__) == LL_USART_PARITY_EVEN) \ - || ((__VALUE__) == LL_USART_PARITY_ODD)) + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ - || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ - || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ - || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ - || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ - || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_1) \ - || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_2)) + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c index ece23086..8d9dbb24 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c @@ -94,6 +94,11 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c /* Init The ULPI Interface */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + /* Select ULPI Interface */ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; +#endif /* defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) */ + /* Select vbus source */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); if (cfg.use_external_vbus == 1U) @@ -115,7 +120,7 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); /* Select UTMI Interace */ - USBx->GUSBCFG &= ~ USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; USBx->GCCFG |= USB_OTG_GCCFG_PHYHSEN; /* Enables control of a High Speed USB PHY */ @@ -158,10 +163,6 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c * @brief Set the USB turnaround time * @param USBx USB Instance * @param hclk: AHB clock frequency - * @param speed device speed - * This parameter can be one of these values: - * @arg PCD_SPEED_HIGH: High speed mode - * @arg PCD_SPEED_FULL: Full speed mode * @retval USB turnaround time In PHY Clocks number */ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, @@ -173,7 +174,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, used by application. In the low AHB frequency range it is used to stretch enough the USB response time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access latency to the Data FIFO */ - if (speed == PCD_SPEED_FULL) + if (speed == USBD_FS_SPEED) { if ((hclk >= 14200000U) && (hclk < 15000000U)) { @@ -226,7 +227,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, UsbTrd = 0x6U; } } - else if (speed == PCD_SPEED_HIGH) + else if (speed == USBD_HS_SPEED) { UsbTrd = USBD_HS_TRDT_VALUE; } @@ -318,6 +319,8 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf /* VBUS Sensing setup */ if (cfg.vbus_sensing_enable == 0U) { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + /* Deactivate VBUS Sensing B */ USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; @@ -339,33 +342,33 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf if (cfg.phy_itface == USB_OTG_ULPI_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else { - /* Set Full speed phy */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); } @@ -431,17 +434,6 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - if (cfg.dma_enable == 1U) - { - /*Set threshold parameters */ - USBx_DEVICE->DTHRCTL = USB_OTG_DTHRCTL_TXTHRLEN_6 | - USB_OTG_DTHRCTL_RXTHRLEN_6; - - USBx_DEVICE->DTHRCTL |= USB_OTG_DTHRCTL_RXTHREN | - USB_OTG_DTHRCTL_ISOTHREN | - USB_OTG_DTHRCTL_NONISOTHREN; - } - /* Disable all interrupts. */ USBx->GINTMSK = 0U; @@ -557,16 +549,16 @@ uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { - speed = PCD_SPEED_HIGH; + speed = USBD_HS_SPEED; } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { - speed = PCD_SPEED_FULL; + speed = USBD_FS_SPEED; } else { - speed = 0U; + speed = 0xFU; } return speed; @@ -663,6 +655,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | @@ -673,6 +671,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | @@ -698,11 +702,23 @@ HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, U /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); } @@ -761,9 +777,27 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + if (ep->type != EP_TYPE_ISOC) { /* Enable the Tx FIFO Empty Interrupt for this EP */ @@ -772,27 +806,20 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } else { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type == EP_TYPE_ISOC) - { - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } } else /* OUT endpoint */ { @@ -890,18 +917,21 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDe { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + /* Enable the Tx FIFO Empty Interrupt for this EP */ if (ep->xfer_len > 0U) { USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else /* OUT endpoint */ { @@ -959,7 +989,7 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin count32b = ((uint32_t)len + 3U) / 4U; for (i = 0U; i < count32b; i++) { - USBx_DFIFO((uint32_t)ch_ep_num) = *((__packed uint32_t *)pSrc); + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); pSrc++; } } @@ -968,15 +998,10 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin } /** - * @brief USB_ReadPacket : read a packet from the Tx FIFO associated - * with the EP/channel + * @brief USB_ReadPacket : read a packet from the RX FIFO * @param USBx Selected device * @param dest source pointer * @param len Number of bytes to read - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used * @retval pointer to destination buffer */ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) @@ -988,7 +1013,7 @@ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) for (i = 0U; i < count32b; i++) { - *(__packed uint32_t *)pDest = USBx_DFIFO(0U); + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); pDest++; } @@ -1260,13 +1285,9 @@ HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx) { uint32_t USBx_BASE = (uint32_t)USBx; - /* Set the MPS of the IN EP based on the enumeration speed */ + /* Set the MPS of the IN EP0 to 64 bytes */ USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - USBx_INEP(0U)->DIEPCTL |= 3U; - } USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; return HAL_OK; @@ -1433,7 +1454,7 @@ HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c if ((USBx->CID & (0x1U << 8)) != 0U) { - if (cfg.speed == USB_OTG_SPEED_FULL) + if (cfg.speed == USBH_FSLS_SPEED) { /* Force Device Enumeration to FS/LS mode only */ USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; @@ -1594,9 +1615,9 @@ HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state) * @param USBx Selected device * @retval speed : Host speed * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode + * @arg HCD_SPEED_HIGH: High speed mode + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode */ uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx) { @@ -1774,7 +1795,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe uint16_t num_packets; uint16_t max_hc_pkt_count = 256U; - if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USB_OTG_SPEED_HIGH)) + if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USBH_HS_SPEED)) { if ((dma == 0U) && (hc->do_ping == 1U)) { @@ -2002,7 +2023,6 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) uint32_t value; uint32_t i; - (void)USB_DisableGlobalInt(USBx); /* Flush FIFO */ @@ -2041,6 +2061,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) /* Clear any pending Host interrupts */ USBx_HOST->HAINT = 0xFFFFFFFFU; USBx->GINTSTS = 0xFFFFFFFFU; + (void)USB_EnableGlobalInt(USBx); return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h index 31ec3b02..988ba1ff 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_CORE_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -84,58 +84,55 @@ */ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); /* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_mps); +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr); -USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t ep_type, uint16_t ep_mps); -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); -uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -void USBD_LL_Delay (uint32_t Delay); +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); + +void USBD_LL_Delay(uint32_t Delay); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h index 9fa2873a..a4bfc44b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USB_REQUEST_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -73,16 +73,14 @@ * @{ */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h index b1e7968d..8219140f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_DEF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -61,9 +61,13 @@ #define USBD_SELF_POWERED 1U #endif /*USBD_SELF_POWERED */ -#ifndef USBD_SUPPORT_USER_STRING -#define USBD_SUPPORT_USER_STRING 0U -#endif /* USBD_SUPPORT_USER_STRING */ +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#ifndef USBD_CLASS_USER_STRING_DESC +#define USBD_CLASS_USER_STRING_DESC 0U +#endif /* USBD_CLASS_USER_STRING_DESC */ #define USB_LEN_DEV_QUALIFIER_DESC 0x0AU #define USB_LEN_DEV_DESC 0x12U @@ -158,37 +162,58 @@ typedef struct usb_setup_req { + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t wDescriptorLengthLow; + uint8_t wDescriptorLengthHigh; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USBD_ConfigDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} USBD_BosDescTypedef; - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}USBD_SetupReqTypedef; struct _USBD_HandleTypeDef; typedef struct _Device_cb { - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); + uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); #endif } USBD_ClassTypeDef; @@ -199,38 +224,44 @@ typedef enum USBD_SPEED_HIGH = 0U, USBD_SPEED_FULL = 1U, USBD_SPEED_LOW = 2U, -}USBD_SpeedTypeDef; +} USBD_SpeedTypeDef; /* Following USB Device status */ -typedef enum { - USBD_OK = 0U, +typedef enum +{ + USBD_OK = 0U, USBD_BUSY, + USBD_EMEM, USBD_FAIL, -}USBD_StatusTypeDef; +} USBD_StatusTypeDef; /* USB Device descriptors structure */ typedef struct { - uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1U) - uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); + uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_CLASS_USER_STRING_DESC == 1) + uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); +#endif +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) + uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); #endif } USBD_DescriptorsTypeDef; /* USB Device handle structure */ typedef struct { - uint32_t status; - uint32_t is_used; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; + uint32_t status; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; + uint16_t is_used; + uint16_t bInterval; } USBD_EndpointTypeDef; /* USB Device handle structure */ @@ -241,8 +272,8 @@ typedef struct _USBD_HandleTypeDef uint32_t dev_default_config; uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; @@ -251,6 +282,7 @@ typedef struct _USBD_HandleTypeDef uint8_t dev_connection_status; uint8_t dev_test_mode; uint32_t dev_remote_wakeup; + uint8_t ConfIdx; USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; @@ -258,6 +290,8 @@ typedef struct _USBD_HandleTypeDef void *pClassData; void *pUserData; void *pData; + void *pBosDesc; + void *pConfDesc; } USBD_HandleTypeDef; /** @@ -269,40 +303,57 @@ typedef struct _USBD_HandleTypeDef /** @defgroup USBD_DEF_Exported_Macros * @{ */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) +__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) +{ + uint16_t _SwapVal, _Byte1, _Byte2; + uint8_t *_pbuff = addr; -#define LOBYTE(x) ((uint8_t)(x & 0x00FFU)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00U) >> 8U)) + _Byte1 = *(uint8_t *)_pbuff; + _pbuff++; + _Byte2 = *(uint8_t *)_pbuff; + + _SwapVal = (_Byte2 << 8) | _Byte1; + + return _SwapVal; +} + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ #endif /* __GNUC__ */ /* In HS mode and when the DMA is used, all variables and data structures dealing with the DMA during the transaction process should be 4-bytes aligned */ -#if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN +#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4U))) +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif /* __ALIGN_BEGIN */ #else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ +#ifndef __ALIGN_END +#define __ALIGN_END +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#if defined (__CC_ARM) /* ARM Compiler */ +#define __ALIGN_BEGIN __align(4U) +#elif defined (__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ #endif /* __GNUC__ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h index 0552e00f..8f077c79 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_IOREQ_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -77,27 +77,22 @@ * @{ */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c index 1cc9b19f..e3db03fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -33,6 +33,7 @@ /** @defgroup USBD_CORE_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -50,13 +51,12 @@ /** @defgroup USBD_CORE_Private_Macros * @{ */ + /** * @} */ - - /** @defgroup USBD_CORE_Private_FunctionPrototypes * @{ */ @@ -73,6 +73,7 @@ * @} */ + /** @defgroup USBD_CORE_Private_Functions * @{ */ @@ -85,10 +86,13 @@ * @param id: Low level core index * @retval None */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, + USBD_DescriptorsTypeDef *pdesc, uint8_t id) { + USBD_StatusTypeDef ret; + /* Check whether the USB Host handle is valid */ - if(pdev == NULL) + if (pdev == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Device handle"); @@ -96,25 +100,31 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * return USBD_FAIL; } - /* Unlink previous class*/ - if(pdev->pClass != NULL) + /* Unlink previous class */ + if (pdev->pClass != NULL) { pdev->pClass = NULL; } + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + /* Assign USBD Descriptors */ - if(pdesc != NULL) + if (pdesc != NULL) { pdev->pDesc = pdesc; } /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; pdev->id = id; - /* Initialize low level driver */ - USBD_LL_Init(pdev); - return USBD_OK; + /* Initialize low level driver */ + ret = USBD_LL_Init(pdev); + + return ret; } /** @@ -125,19 +135,34 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * */ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + if (ret != USBD_OK) + { + return ret; + } /* Initialize low level driver */ - USBD_LL_DeInit(pdev); + ret = USBD_LL_DeInit(pdev); - return USBD_OK; + return ret; } /** @@ -147,24 +172,30 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) * @param pclass: Class handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) { - USBD_StatusTypeDef status = USBD_OK; - if(pclass != 0) - { - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - status = USBD_OK; - } - else + uint16_t len = 0U; + + if (pclass == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Class handle"); #endif - status = USBD_FAIL; + return USBD_FAIL; } - return status; + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + + /* Get Device Configuration Descriptor */ +#ifdef USE_USB_FS + pdev->pConfDesc = (void *)pdev->pClass->GetFSConfigDescriptor(&len); +#else /* USE_USB_HS */ + pdev->pConfDesc = (void *)pdev->pClass->GetHSConfigDescriptor(&len); +#endif /* USE_USB_FS */ + + + return USBD_OK; } /** @@ -173,13 +204,10 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) { - /* Start the low level driver */ - USBD_LL_Start(pdev); - - return USBD_OK; + return USBD_LL_Start(pdev); } /** @@ -188,15 +216,25 @@ USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } - return USBD_OK; + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + return ret; } /** @@ -205,7 +243,7 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -221,17 +259,14 @@ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - USBD_StatusTypeDef ret = USBD_FAIL; + USBD_StatusTypeDef ret = USBD_FAIL; - if(pdev->pClass != NULL) + if (pdev->pClass != NULL) { - /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0U) - { - ret = USBD_OK; - } + /* Set configuration and Start the Class */ + ret = (USBD_StatusTypeDef)pdev->pClass->Init(pdev, cfgidx); } return ret; @@ -244,10 +279,14 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx * @param cfgidx: configuration index * @retval status: USBD_StatusTypeDef */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - /* Clear configuration and De-initialize the Class process*/ - pdev->pClass->DeInit(pdev, cfgidx); + /* Clear configuration and De-initialize the Class process */ + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, cfgidx); + } + return USBD_OK; } @@ -260,6 +299,8 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { + USBD_StatusTypeDef ret; + USBD_ParseSetupRequest(&pdev->request, psetup); pdev->ep0_state = USBD_EP0_SETUP; @@ -268,24 +309,24 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) switch (pdev->request.bmRequest & 0x1FU) { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_DEVICE: + ret = USBD_StdDevReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_INTERFACE: + ret = USBD_StdItfReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_ENDPOINT: + ret = USBD_StdEPReq(pdev, &pdev->request); + break; - default: - USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; + default: + ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; } - return USBD_OK; + return ret; } /** @@ -298,48 +339,54 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) { - USBD_EndpointTypeDef *pep; + USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_out[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_OUT) + if (pdev->ep0_state == USBD_EP0_DATA_OUT) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { - pep->rem_length -= pep->maxpacket; + pep->rem_length -= pep->maxpacket; - USBD_CtlContinueRx (pdev, - pdata, - (uint16_t)MIN(pep->rem_length, pep->maxpacket)); + (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); } else { - if((pdev->pClass->EP0_RxReady != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_RxReady != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_RxReady(pdev); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else { +#if 0 if (pdev->ep0_state == USBD_EP0_STATUS_OUT) { /* * STATUS PHASE completed, update ep0_state to idle */ pdev->ep0_state = USBD_EP0_IDLE; - USBD_LL_StallEP(pdev, 0U); + (void)USBD_LL_StallEP(pdev, 0U); } +#endif } } - else if((pdev->pClass->DataOut != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataOut != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataOut(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataOut(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -357,69 +404,78 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, - uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_in[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_IN) + if (pdev->ep0_state == USBD_EP0_DATA_IN) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; - USBD_CtlContinueSendData (pdev, pdata, (uint16_t)pep->rem_length); + (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else - { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0U) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) + { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->maxpacket == pep->rem_length) && + (pep->total_length >= pep->maxpacket) && + (pep->total_length < pdev->ep0_data_len)) { - USBD_CtlContinueSendData(pdev, NULL, 0U); + (void)USBD_CtlContinueSendData(pdev, NULL, 0U); pdev->ep0_data_len = 0U; /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else { - if((pdev->pClass->EP0_TxSent != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_TxSent != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_TxSent(pdev); } - USBD_LL_StallEP(pdev, 0x80U); - USBD_CtlReceiveStatus(pdev); + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_CtlReceiveStatus(pdev); } } } else { +#if 0 if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || (pdev->ep0_state == USBD_EP0_IDLE)) { - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0x80U); } +#endif } if (pdev->dev_test_mode == 1U) { - USBD_RunTestMode(pdev); + (void)USBD_RunTestMode(pdev); pdev->dev_test_mode = 0U; } } - else if((pdev->pClass->DataIn != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataIn != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataIn(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataIn(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -437,29 +493,30 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, * @retval status */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { - /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClassData != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } + + /* Open EP0 OUT */ + (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_out[0x00U & 0xFU].is_used = 1U; pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_in[0x80U & 0xFU].is_used = 1U; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config= 0U; - pdev->dev_remote_wakeup = 0U; - - if (pdev->pClassData) - { - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); - } return USBD_OK; } @@ -470,9 +527,11 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, + USBD_SpeedTypeDef speed) { pdev->dev_speed = speed; + return USBD_OK; } @@ -483,10 +542,11 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef * @retval status */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) { - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + return USBD_OK; } @@ -497,9 +557,13 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) { - pdev->dev_state = pdev->dev_old_state; + if (pdev->dev_state == USBD_STATE_SUSPENDED) + { + pdev->dev_state = pdev->dev_old_state; + } + return USBD_OK; } @@ -510,15 +574,16 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) { - if(pdev->dev_state == USBD_STATE_CONFIGURED) + if (pdev->dev_state == USBD_STATE_CONFIGURED) { - if(pdev->pClass->SOF != NULL) + if (pdev->pClass->SOF != NULL) { pdev->pClass->SOF(pdev); } } + return USBD_OK; } @@ -528,7 +593,8 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -543,7 +609,8 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -558,7 +625,7 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -572,11 +639,15 @@ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } return USBD_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c index c3e7ecbe..c51f3497 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -35,6 +35,7 @@ /** @defgroup USBD_REQ_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -52,6 +53,7 @@ /** @defgroup USBD_REQ_Private_Macros * @{ */ + /** * @} */ @@ -60,6 +62,7 @@ /** @defgroup USBD_REQ_Private_Variables * @{ */ + /** * @} */ @@ -68,27 +71,13 @@ /** @defgroup USBD_REQ_Private_FunctionPrototypes * @{ */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t USBD_GetLen(uint8_t *buf); /** @@ -108,7 +97,7 @@ static uint8_t USBD_GetLen(uint8_t *buf); * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -116,41 +105,38 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType { case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup(pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req); + USBD_GetDescriptor(pdev, req); break; case USB_REQ_SET_ADDRESS: - USBD_SetAddress (pdev, req); + USBD_SetAddress(pdev, req); break; case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev, req); + ret = USBD_SetConfig(pdev, req); break; case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev, req); + USBD_GetConfig(pdev, req); break; case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev, req); + USBD_GetStatus(pdev, req); break; - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev, req); + USBD_SetFeature(pdev, req); break; case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev, req); + USBD_ClrFeature(pdev, req); break; default: @@ -174,7 +160,7 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -191,11 +177,11 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); if ((req->wLength == 0U) && (ret == USBD_OK)) { - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else @@ -215,7 +201,7 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType break; } - return USBD_OK; + return ret; } /** @@ -225,43 +211,31 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - uint8_t ep_addr; + USBD_EndpointTypeDef *pep; + uint8_t ep_addr; USBD_StatusTypeDef ret = USBD_OK; - USBD_EndpointTypeDef *pep; - ep_addr = LOBYTE(req->wIndex); + ep_addr = LOBYTE(req->wIndex); switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - /* Check if it is a class request */ - if ((req->bmRequest & 0x60U) == 0x20U) - { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); - - return ret; - } - switch (req->bRequest) { - - case USB_REQ_SET_FEATURE : - + case USB_REQ_SET_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -274,10 +248,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) { - USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, ep_addr); } } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); break; @@ -287,15 +261,15 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } break; - case USB_REQ_CLEAR_FEATURE : + case USB_REQ_CLEAR_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -308,9 +282,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr & 0x7FU) != 0x00U) { - USBD_LL_ClearStallEP(pdev, ep_addr); + (void)USBD_LL_ClearStallEP(pdev, ep_addr); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); + (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); } break; @@ -329,16 +304,16 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped USBD_CtlError(pdev, req); break; } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; - pep->status = 0x0000U; + pep->status = 0x0000U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); - break; + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); + break; case USBD_STATE_CONFIGURED: - if((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80U) == 0x80U) { if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) { @@ -355,14 +330,14 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) { pep->status = 0x0000U; } - else if(USBD_LL_IsStallEP(pdev, ep_addr)) + else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) { pep->status = 0x0001U; } @@ -371,7 +346,7 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped pep->status = 0x0000U; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); break; default: @@ -393,6 +368,8 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped return ret; } + + /** * @brief USBD_GetDescriptor * Handle Get Descriptor requests @@ -400,18 +377,25 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped * @param req: usb request * @retval status */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - uint16_t len; - uint8_t *pbuf; - + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t err = 0U; switch (req->wValue >> 8) { -#if (USBD_LPM_ENABLED == 1U) +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) case USB_DESC_TYPE_BOS: - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetBOSDescriptor != NULL) + { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; #endif case USB_DESC_TYPE_DEVICE: @@ -419,14 +403,14 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; case USB_DESC_TYPE_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } else { - pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } break; @@ -435,81 +419,159 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , switch ((uint8_t)(req->wValue)) { case USBD_IDX_LANGID_STR: - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_MFC_STR: - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_PRODUCT_STR: - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetProductStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_SERIAL_STR: - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetSerialStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_CONFIG_STR: - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_INTERFACE_STR: - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; default: -#if (USBD_SUPPORT_USER_STRING == 1U) - pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); - break; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) + { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } +#elif (USBD_CLASS_USER_STRING_DESC == 1U) + if (pdev->pDesc->GetUserStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } #else - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; #endif + break; } break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if(pdev->dev_speed == USBD_SPEED_HIGH) + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); - break; + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) + { return; } - - if((len != 0U) && (req->wLength != 0U)) + else { - - len = MIN(len, req->wLength); - - USBD_CtlSendData (pdev, pbuf, len); - } - - if(req->wLength == 0U) - { - USBD_CtlSendStatus(pdev); + if (req->wLength != 0U) + { + if (len != 0U) + { + len = MIN(len, req->wLength); + (void)USBD_CtlSendData(pdev, pbuf, len); + } + else + { + USBD_CtlError(pdev, req); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } } } @@ -520,8 +582,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { uint8_t dev_addr; @@ -531,13 +592,13 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { pdev->dev_address = dev_addr; - USBD_LL_SetUSBAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); + (void)USBD_LL_SetUSBAddress(pdev, dev_addr); + (void)USBD_CtlSendStatus(pdev); if (dev_addr != 0U) { @@ -562,8 +623,9 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { + USBD_StatusTypeDef ret = USBD_OK; static uint8_t cfgidx; cfgidx = (uint8_t)(req->wValue); @@ -571,63 +633,77 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { USBD_CtlError(pdev, req); + return USBD_FAIL; } - else + + switch (pdev->dev_state) { - switch (pdev->dev_state) + case USBD_STATE_ADDRESSED: + if (cfgidx != 0U) { - case USBD_STATE_ADDRESSED: - if (cfgidx) + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { - pdev->dev_config = cfgidx; + USBD_CtlError(pdev, req); + } + else + { + (void)USBD_CtlSendStatus(pdev); pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev, cfgidx); - USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - USBD_ClrClassConfig(pdev, cfgidx); - break; } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + (void)USBD_ClrClassConfig(pdev, cfgidx); + (void)USBD_CtlSendStatus(pdev); + } + else if (cfgidx != pdev->dev_config) + { + /* Clear old configuration */ + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) + { + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + pdev->dev_state = USBD_STATE_ADDRESSED; + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, cfgidx); + ret = USBD_FAIL; + break; } + + return ret; } /** @@ -641,7 +717,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { if (req->wLength != 1U) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { @@ -650,15 +726,15 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: pdev->dev_default_config = 0U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); break; case USBD_STATE_CONFIGURED: - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } } @@ -678,28 +754,28 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: - if(req->wLength != 0x2U) + if (req->wLength != 0x2U) { USBD_CtlError(pdev, req); break; } -#if ( USBD_SELF_POWERED == 1U) +#if (USBD_SELF_POWERED == 1U) pdev->dev_config_status = USB_CONFIG_SELF_POWERED; #else pdev->dev_config_status = 0U; #endif - if (pdev->dev_remote_wakeup) + if (pdev->dev_remote_wakeup != 0U) { pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); break; - default : - USBD_CtlError(pdev , req); + default: + USBD_CtlError(pdev, req); break; } } @@ -712,16 +788,13 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * @param req: usb request * @retval status */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { pdev->dev_remote_wakeup = 1U; - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } - } @@ -732,24 +805,23 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { switch (pdev->dev_state) { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - USBD_CtlSendStatus(pdev); - } - break; + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 0U; + (void)USBD_CtlSendStatus(pdev); + } + break; - default : - USBD_CtlError(pdev , req); - break; + default: + USBD_CtlError(pdev, req); + break; } } @@ -763,12 +835,23 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) { - req->bmRequest = *(uint8_t *) (pdata); - req->bRequest = *(uint8_t *) (pdata + 1); - req->wValue = SWAPBYTE (pdata + 2); - req->wIndex = SWAPBYTE (pdata + 4); - req->wLength = SWAPBYTE (pdata + 6); + uint8_t *pbuff = pdata; + req->bmRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->bRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->wValue = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wIndex = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wLength = SWAPBYTE(pbuff); } /** @@ -779,11 +862,12 @@ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) * @retval None */ -void USBD_CtlError( USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_LL_StallEP(pdev , 0x80U); - USBD_LL_StallEP(pdev , 0U); + UNUSED(req); + + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0U); } @@ -798,18 +882,29 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) { uint8_t idx = 0U; + uint8_t *pdesc; - if (desc != NULL) + if (desc == NULL) { - *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; - unicode[idx++] = *(uint8_t *)(void *)len; - unicode[idx++] = USB_DESC_TYPE_STRING; + return; + } - while (*desc != '\0') - { - unicode[idx++] = *desc++; - unicode[idx++] = 0U; - } + pdesc = desc; + *len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U; + + unicode[idx] = *(uint8_t *)len; + idx++; + unicode[idx] = USB_DESC_TYPE_STRING; + idx++; + + while (*pdesc != (uint8_t)'\0') + { + unicode[idx] = *pdesc; + pdesc++; + idx++; + + unicode[idx] = 0U; + idx++; } } @@ -821,15 +916,16 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) */ static uint8_t USBD_GetLen(uint8_t *buf) { - uint8_t len = 0U; + uint8_t len = 0U; + uint8_t *pbuff = buf; - while (*buf != '\0') - { - len++; - buf++; - } + while (*pbuff != (uint8_t)'\0') + { + len++; + pbuff++; + } - return len; + return len; } /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c index 5600c370..4d5c8efe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -84,16 +84,16 @@ * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_IN; pdev->ep_in[0].total_length = len; - pdev->ep_in[0].rem_length = len; + pdev->ep_in[0].rem_length = len; - /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -106,11 +106,11 @@ USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - /* Start the next transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the next transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -123,16 +123,16 @@ USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_OUT; pdev->ep_out[0].total_length = len; - pdev->ep_out[0].rem_length = len; + pdev->ep_out[0].rem_length = len; /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -145,10 +145,10 @@ USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -159,13 +159,13 @@ USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_IN; /* Start the transfer */ - USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); return USBD_OK; } @@ -176,13 +176,13 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_OUT; - /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + /* Start the transfer */ + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); return USBD_OK; } @@ -194,7 +194,7 @@ USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) * @param ep_addr: endpoint address * @retval Rx Data blength */ -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.c index 2c7b2f09..6738d157 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.c @@ -504,7 +504,7 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; @@ -524,7 +524,7 @@ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, u * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h index 457df6b8..13647fbd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_conf.h @@ -68,8 +68,6 @@ /*---------- -----------*/ #define USBD_MAX_STR_DESC_SIZ 512U /*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0U -/*---------- -----------*/ #define USBD_DEBUG_LEVEL 0U /*---------- -----------*/ #define USBD_LPM_ENABLED 0U @@ -81,6 +79,9 @@ #define DEVICE_FS 0 #define DEVICE_HS 1 +/* Inform USB core that a full speed device is used. */ +#define USE_USB_FS + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c index c26b821d..344676bb 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Boot/usbd_desc.c @@ -123,11 +123,6 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); - -#ifdef USBD_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - #if (USBD_LPM_ENABLED == 1) uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); #endif /* (USBD_LPM_ENABLED == 1) */ @@ -328,7 +323,9 @@ uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) /* Update the serial number string descriptor with the data from the unique * ID */ Get_SerialNum(); - + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ return (uint8_t *) USBD_StringSerial; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/bin/demoprog_stm32f746.elf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/bin/demoprog_stm32f746.elf index cd46f998691eed7a1015bb53e4decf6e41021220..0696c3f961e54c9d8f2df321200a2348da46052e 100755 GIT binary patch delta 50081 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%0An;C;qh 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
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics
+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h index 4209206e..473ff95e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h @@ -125,8 +125,6 @@ typedef struct This parameter can be a value of @ref UART_MSB_First. */ } UART_AdvFeatureInitTypeDef; - - /** * @brief HAL UART State definition * @note HAL UART State value is a combination of 2 different substates: gState and RxState (see @ref UART_State_Definition). @@ -206,10 +204,9 @@ typedef struct __UART_HandleTypeDef uint16_t Mask; /*!< UART Rx RDR register mask */ + void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ + void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ @@ -313,8 +310,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define HAL_UART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_UART_ERROR_RTO ((uint32_t)0x00000020U) /*!< Receiver Timeout error */ + #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000020U) /*!< Invalid Callback error */ +#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000040U) /*!< Invalid Callback error */ #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ /** * @} @@ -400,11 +399,11 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @} */ -/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut +/** @defgroup UART_Receiver_Timeout UART Receiver Timeout * @{ */ -#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART receiver timeout disable */ -#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART receiver timeout enable */ +#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART Receiver Timeout disable */ +#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART Receiver Timeout enable */ /** * @} */ @@ -562,6 +561,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_Stop_Mode_Enable UART Advanced Feature Stop Mode Enable + * @{ + */ +#define UART_ADVFEATURE_STOPMODE_DISABLE 0x00000000U /*!< UART stop mode disable */ +#define UART_ADVFEATURE_STOPMODE_ENABLE USART_CR1_UESM /*!< UART stop mode enable */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_Mute_Mode UART Advanced Feature Mute Mode Enable * @{ @@ -579,6 +589,18 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_WakeUp_from_Stop_Selection UART WakeUp From Stop Selection + * @{ + */ +#define UART_WAKEUP_ON_ADDRESS 0x00000000U /*!< UART wake-up on address */ +#define UART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< UART wake-up on start bit */ +#define UART_WAKEUP_ON_READDATA_NONEMPTY USART_CR3_WUS /*!< UART wake-up on receive data register not empty or RXFIFO is not empty */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_DriverEnable_Polarity UART DriverEnable Polarity * @{ @@ -626,13 +648,20 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * - 0xXXXX : Flag mask in the ISR register * @{ */ +#if defined(USART_ISR_REACK) +#define UART_FLAG_REACK USART_ISR_REACK /*!< UART receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #define UART_FLAG_TEACK USART_ISR_TEACK /*!< UART transmit enable acknowledge flag */ +#if defined(USART_CR1_UESM) +#define UART_FLAG_WUF USART_ISR_WUF /*!< UART wake-up from stop mode flag */ +#endif /* USART_CR1_UESM */ #define UART_FLAG_RWU USART_ISR_RWU /*!< UART receiver wake-up from mute mode flag */ #define UART_FLAG_SBKF USART_ISR_SBKF /*!< UART send break flag */ #define UART_FLAG_CMF USART_ISR_CMF /*!< UART character match flag */ #define UART_FLAG_BUSY USART_ISR_BUSY /*!< UART busy flag */ #define UART_FLAG_ABRF USART_ISR_ABRF /*!< UART auto Baud rate flag */ #define UART_FLAG_ABRE USART_ISR_ABRE /*!< UART auto Baud rate error */ +#define UART_FLAG_RTOF USART_ISR_RTOF /*!< UART receiver timeout flag */ #define UART_FLAG_CTS USART_ISR_CTS /*!< UART clear to send flag */ #define UART_FLAG_CTSIF USART_ISR_CTSIF /*!< UART clear to send interrupt flag */ #define UART_FLAG_LBDF USART_ISR_LBDF /*!< UART LIN break detection flag */ @@ -674,6 +703,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define UART_IT_LBD 0x0846U /*!< UART LIN break detection interruption */ #define UART_IT_CTS 0x096AU /*!< UART CTS interruption */ #define UART_IT_CM 0x112EU /*!< UART character match interruption */ +#if defined(USART_CR1_UESM) +#define UART_IT_WUF 0x1476U /*!< UART wake-up from stop mode interruption */ +#endif /* USART_CR1_UESM */ +#define UART_IT_RTO 0x0B3AU /*!< UART receiver timeout interruption */ #define UART_IT_ERR 0x0060U /*!< UART error interruption */ @@ -689,13 +722,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define UART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ #define UART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ +#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ #define UART_CLEAR_OREF USART_ICR_ORECF /*!< Overrun Error Clear Flag */ #define UART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ #define UART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ #define UART_CLEAR_LBDF USART_ICR_LBDCF /*!< LIN Break Detection Clear Flag */ #define UART_CLEAR_CTSF USART_ICR_CTSCF /*!< CTS Interrupt Clear Flag */ #define UART_CLEAR_CMF USART_ICR_CMCF /*!< Character Match Clear Flag */ +#if defined(USART_CR1_UESM) +#define UART_CLEAR_WUF USART_ICR_WUCF /*!< Wake Up from stop mode Clear Flag */ +#endif /* USART_CR1_UESM */ +#define UART_CLEAR_RTOF USART_ICR_RTOCF /*!< UART receiver timeout clear flag */ /** * @} */ @@ -734,9 +771,9 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) \ do{ \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ - } while(0U) + SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ + SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ + } while(0U) /** @brief Clear the specified UART pending flag. * @param __HANDLE__ specifies the UART Handle. @@ -748,9 +785,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver Timeout clear flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag +#if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) @@ -790,7 +831,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __FLAG__ specifies the flag to check. * This parameter can be one of the following values: +#if defined(USART_ISR_REACK) + * @arg @ref UART_FLAG_REACK Receive enable acknowledge flag +#endif * @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_FLAG_WUF Wake up from stop mode flag + #endif * @arg @ref UART_FLAG_RWU Receiver wake up flag (if the UART in mute mode) * @arg @ref UART_FLAG_SBKF Send Break flag * @arg @ref UART_FLAG_CMF Character match flag @@ -802,6 +849,7 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_FLAG_TXE Transmit data register empty flag * @arg @ref UART_FLAG_TC Transmission Complete flag * @arg @ref UART_FLAG_RXNE Receive data register not empty flag + * @arg @ref UART_FLAG_RTOF Receiver Timeout flag * @arg @ref UART_FLAG_IDLE Idle Line detection flag * @arg @ref UART_FLAG_ORE Overrun Error flag * @arg @ref UART_FLAG_NE Noise Error flag @@ -815,12 +863,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to enable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (frame error, noise error, overrun error) @@ -835,12 +887,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to disable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) @@ -854,37 +910,46 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ -#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) +#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\ + & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) /** @brief Check whether the specified UART interrupt source is enabled or not. * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ #define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U) ? (__HANDLE__)->Instance->CR1 : \ - (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ - (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) + (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ + (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) /** @brief Clear the specified UART ISR flag, in setting the proper ICR register flag. * @param __HANDLE__ specifies the UART Handle. @@ -896,10 +961,14 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_NEF Noise detected Clear Flag * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver timeout clear flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) @@ -1083,10 +1152,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid) */ #define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__)\ - (((__CONTROL__) == UART_HWCONTROL_NONE) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS) || \ - ((__CONTROL__) == UART_HWCONTROL_CTS) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) + (((__CONTROL__) == UART_HWCONTROL_NONE) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS) || \ + ((__CONTROL__) == UART_HWCONTROL_CTS) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) /** * @brief Ensure that UART communication mode is valid. @@ -1134,8 +1203,15 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __TIMEOUT__ UART receiver timeout setting. * @retval SET (__TIMEOUT__ is valid) or RESET (__TIMEOUT__ is invalid) */ -#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ - ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) +#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ + ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) + +/** @brief Check the receiver timeout value. + * @note The maximum UART receiver timeout value is 0xFFFFFF. + * @param __TIMEOUTVALUE__ receiver timeout value. + * @retval Test result (TRUE or FALSE) + */ +#define IS_UART_RECEIVER_TIMEOUT_VALUE(__TIMEOUTVALUE__) ((__TIMEOUTVALUE__) <= 0xFFFFFFU) /** * @brief Ensure that UART LIN state is valid. @@ -1275,6 +1351,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define IS_UART_ADVFEATURE_MSBFIRST(__MSBFIRST__) (((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_DISABLE) || \ ((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_ENABLE)) +#if defined(USART_CR1_UESM) +/** + * @brief Ensure that UART stop mode state is valid. + * @param __STOPMODE__ UART stop mode state. + * @retval SET (__STOPMODE__ is valid) or RESET (__STOPMODE__ is invalid) + */ +#define IS_UART_ADVFEATURE_STOPMODE(__STOPMODE__) (((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_DISABLE) || \ + ((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_ENABLE)) + +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART mute mode state is valid. * @param __MUTE__ UART mute mode state. @@ -1282,6 +1368,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define IS_UART_MUTE_MODE(__MUTE__) (((__MUTE__) == UART_ADVFEATURE_MUTEMODE_DISABLE) || \ ((__MUTE__) == UART_ADVFEATURE_MUTEMODE_ENABLE)) +#if defined(USART_CR1_UESM) + +/** + * @brief Ensure that UART wake-up selection is valid. + * @param __WAKE__ UART wake-up selection. + * @retval SET (__WAKE__ is valid) or RESET (__WAKE__ is invalid) + */ +#define IS_UART_WAKEUP_SELECTION(__WAKE__) (((__WAKE__) == UART_WAKEUP_ON_ADDRESS) || \ + ((__WAKE__) == UART_WAKEUP_ON_STARTBIT) || \ + ((__WAKE__) == UART_WAKEUP_ON_READDATA_NONEMPTY)) +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART driver enable polarity is valid. @@ -1320,7 +1417,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -1369,6 +1467,10 @@ void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); */ /* Peripheral Control functions ************************************************/ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue); +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart); + HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart); @@ -1405,7 +1507,8 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart); HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart); -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); void UART_AdvFeatureConfig(UART_HandleTypeDef *huart); /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h index a5907f57..866a490f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h @@ -41,7 +41,24 @@ extern "C" { * @{ */ +#if defined(USART_CR1_UESM) +/** + * @brief UART wake up from stop mode parameters + */ +typedef struct +{ + uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF). + This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection. + If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must + be filled up. */ + uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long. + This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */ + + uint8_t Address; /*!< UART/USART node address (7-bit long max). */ +} UART_WakeUpTypeDef; + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -54,9 +71,9 @@ extern "C" { /** @defgroup UARTEx_Word_Length UARTEx Word Length * @{ */ -#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ -#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ -#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ +#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ +#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ +#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ /** * @} */ @@ -64,13 +81,12 @@ extern "C" { /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length * @{ */ -#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ -#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ +#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ +#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ /** * @} */ - /** * @} */ @@ -86,7 +102,8 @@ extern "C" { */ /* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime); +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime); /** * @} @@ -96,6 +113,10 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @{ */ +#if defined(USART_CR1_UESM) +void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart); + +#endif /* USART_CR1_UESM */ /** * @} @@ -106,8 +127,20 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, */ /* Peripheral Control functions **********************************************/ +#if defined(USART_CR1_UESM) +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart); + +#endif/* USART_CR1_UESM */ +#if defined(USART_CR3_UCESM) +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart); + +#endif /* USART_CR3_UCESM */ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength); + /** * @} */ @@ -126,12 +159,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua * @param __CLOCKSOURCE__ output variable. * @retval UART clocking source, written in __CLOCKSOURCE__. */ -#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ +#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ do { \ if((__HANDLE__)->Instance == USART1) \ { \ - switch(__HAL_RCC_GET_USART1_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART1_SOURCE()) \ + { \ case RCC_USART1CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -147,12 +180,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART2) \ { \ - switch(__HAL_RCC_GET_USART2_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART2_SOURCE()) \ + { \ case RCC_USART2CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -168,12 +201,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART3) \ { \ - switch(__HAL_RCC_GET_USART3_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART3_SOURCE()) \ + { \ case RCC_USART3CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -189,12 +222,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == UART4) \ { \ - switch(__HAL_RCC_GET_UART4_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART4_SOURCE()) \ + { \ case RCC_UART4CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -210,12 +243,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART5) \ { \ - switch(__HAL_RCC_GET_UART5_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART5_SOURCE()) \ + { \ case RCC_UART5CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -231,12 +264,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART6) \ { \ - switch(__HAL_RCC_GET_USART6_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART6_SOURCE()) \ + { \ case RCC_USART6CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -252,12 +285,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART7) \ { \ - switch(__HAL_RCC_GET_UART7_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART7_SOURCE()) \ + { \ case RCC_UART7CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -273,12 +306,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART8) \ { \ - switch(__HAL_RCC_GET_UART8_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART8_SOURCE()) \ + { \ case RCC_UART8CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -294,7 +327,7 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else \ { \ @@ -313,44 +346,44 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua */ #define UART_MASK_COMPUTATION(__HANDLE__) \ do { \ - if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x01FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x003FU ; \ - } \ - } \ - else \ - { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ -} while(0U) + } \ + } \ + else \ + { \ + (__HANDLE__)->Mask = 0x0000U; \ + } \ + } while(0U) /** * @brief Ensure that UART frame length is valid. @@ -369,7 +402,6 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \ ((__ADDRESS__) == UART_ADDRESS_DETECT_7B)) - /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c index 76efbf84..25a901fe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c @@ -326,7 +326,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -346,7 +345,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -393,7 +391,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -416,7 +413,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -481,7 +477,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -507,7 +502,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe /* Set the USART LIN Break detection length. */ MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -567,7 +561,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -596,7 +589,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add /* Set the wake up method by setting the WAKE bit in the CR1 register */ MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -622,7 +614,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); huart->Instance->CR1 = 0x0U; @@ -645,7 +636,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_RESET; huart->RxState = HAL_UART_STATE_RESET; - /* Process Unlock */ __HAL_UNLOCK(huart); return HAL_OK; @@ -704,18 +694,18 @@ __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) * @param pCallback pointer to the Callback function * @retval HAL status */ -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; if (pCallback == NULL) { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; return HAL_ERROR; } - /* Process locked */ + __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_READY) @@ -768,10 +758,8 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -789,24 +777,19 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -837,7 +820,6 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR { HAL_StatusTypeDef status = HAL_OK; - /* Process locked */ __HAL_LOCK(huart); if (HAL_UART_STATE_READY == huart->gState) @@ -876,6 +858,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ break; +#if defined(USART_CR1_UESM) + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + break; + +#endif /* USART_CR1_UESM */ case HAL_UART_MSPINIT_CB_ID : huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ break; @@ -885,10 +873,8 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -906,24 +892,19 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -992,6 +973,11 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR (+) HAL_UART_AbortCpltCallback() (+) HAL_UART_AbortTransmitCpltCallback() (+) HAL_UART_AbortReceiveCpltCallback() +#if defined(USART_CR1_UESM) + + (#) Wakeup from Stop mode Callback: + (+) HAL_UARTEx_WakeupCallback() +#endif (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. Errors are handled as follows : @@ -1013,9 +999,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR /** * @brief Send an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1033,7 +1022,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1045,7 +1033,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u huart->TxXferSize = Size; huart->TxXferCount = Size; - /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { pdata8bits = NULL; @@ -1057,6 +1045,8 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u pdata16bits = NULL; } + __HAL_UNLOCK(huart); + while (huart->TxXferCount > 0U) { if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) @@ -1084,9 +1074,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /* At end of Tx process, restore huart->gState to Ready */ huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1097,9 +1084,12 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /** * @brief Receive an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1118,7 +1108,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1146,6 +1135,8 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui pdata16bits = NULL; } + __HAL_UNLOCK(huart); + /* as long as data have to be received */ while (huart->RxXferCount > 0U) { @@ -1169,9 +1160,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /* At end of Rx process, restore huart->RxState to Ready */ huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1182,9 +1170,12 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /** * @brief Send an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1197,7 +1188,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1218,7 +1208,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData huart->TxISR = UART_TxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the Transmit Data Register Empty interrupt */ @@ -1234,9 +1223,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData /** * @brief Receive an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1249,7 +1241,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1276,7 +1267,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, huart->RxISR = UART_RxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ @@ -1292,9 +1282,12 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, /** * @brief Send an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1307,7 +1300,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1337,7 +1329,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1349,7 +1340,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Clear the TC flag in the ICR register */ __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF); - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the DMA transfer for transmit request by setting the DMAT bit @@ -1368,9 +1358,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat * @brief Receive an amount of data in DMA mode. * @note When the UART parity is enabled (PCE = 1), the received data contain * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1383,7 +1376,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1412,7 +1404,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1421,7 +1412,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error Interrupt */ @@ -1452,7 +1442,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) const HAL_UART_StateTypeDef gstate = huart->gState; const HAL_UART_StateTypeDef rxstate = huart->RxState; - /* Process Locked */ __HAL_LOCK(huart); if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && @@ -1472,7 +1461,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1485,7 +1473,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_BUSY_TX) @@ -1506,7 +1493,6 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1591,7 +1577,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) { /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1663,7 +1649,6 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Reset Handle ErrorCode to No Error */ huart->ErrorCode = HAL_UART_ERROR_NONE; return HAL_OK; @@ -1680,7 +1665,7 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) { /* Disable TXEIE and TCIE interrupts */ @@ -1732,7 +1717,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1792,7 +1777,7 @@ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) { uint32_t abortcplt = 1U; @@ -1931,7 +1916,7 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) { /* Disable interrupts */ @@ -2015,7 +2000,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -2110,7 +2095,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) uint32_t errorcode; /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE)); + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); if (errorflags == 0U) { /* UART in mode Receiver ---------------------------------------------------*/ @@ -2164,10 +2149,18 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) huart->ErrorCode |= HAL_UART_ERROR_ORE; } - /* Call UART Error Call back function if need be --------------------------*/ + /* UART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + huart->ErrorCode |= HAL_UART_ERROR_RTO; + } + + /* Call UART Error Call back function if need be ----------------------------*/ if (huart->ErrorCode != HAL_UART_ERROR_NONE) { - /* UART in mode Receiver ---------------------------------------------------*/ + /* UART in mode Receiver --------------------------------------------------*/ if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U)) { @@ -2177,11 +2170,14 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) } } - /* If Overrun error occurs, or if any error occurs in DMA mode reception, - consider error as blocking */ + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ errorcode = huart->ErrorCode; if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) || - ((errorcode & HAL_UART_ERROR_ORE) != 0U)) + ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U)) { /* Blocking error : transfer is aborted Set the UART state ready to be able to start again the process, @@ -2249,6 +2245,26 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) return; } /* End if some error occurs */ +#if defined(USART_CR1_UESM) + + /* UART wakeup from Stop mode interrupt occurred ---------------------------*/ + if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF); + + /* UART Rx state is not reset as a reception process might be ongoing. + If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Wakeup Callback */ + huart->WakeupCallback(huart); +#else + /* Call legacy weak Wakeup Callback */ + HAL_UARTEx_WakeupCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } +#endif /* USART_CR1_UESM */ /* UART in mode Transmitter ------------------------------------------------*/ if (((isrflags & USART_ISR_TXE) != 0U) @@ -2390,6 +2406,23 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ } +#if defined(USART_CR1_UESM) +/** + * @brief UART wakeup from Stop mode callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_WakeupCallback can be implemented in the user file. + */ +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2403,6 +2436,9 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) =============================================================================== [..] This subsection provides a set of functions allowing to control the UART. + (+) HAL_UART_ReceiverTimeout_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_UART_EnableReceiverTimeout() API enables the receiver timeout feature + (+) HAL_UART_DisableReceiverTimeout() API disables the receiver timeout feature (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode @@ -2416,6 +2452,82 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) * @{ */ +/** + * @brief Update on the fly the receiver timeout value in RTOR register. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param TimeoutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue) +{ + assert_param(IS_UART_RECEIVER_TIMEOUT_VALUE(TimeoutValue)); + MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, TimeoutValue); +} + +/** + * @brief Enable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + /** * @brief Enable UART in mute mode (does not mean UART enters mute mode; * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called). @@ -2424,7 +2536,6 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2445,7 +2556,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2476,7 +2586,6 @@ void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2488,7 +2597,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2501,7 +2609,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2513,7 +2620,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2530,7 +2636,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) /* Check the parameters */ assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2540,7 +2645,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2551,8 +2655,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ /** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions - * @brief UART Peripheral State functions - * + * @brief UART Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State and Error functions ##### @@ -2574,7 +2678,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) { - uint32_t temp1, temp2; + uint32_t temp1; + uint32_t temp2; temp1 = huart->gState; temp2 = huart->RxState; @@ -2586,7 +2691,7 @@ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART. * @retval UART Error Code -*/ + */ uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) { return huart->ErrorCode; @@ -2620,6 +2725,9 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ +#if defined(USART_CR1_UESM) + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ +#endif /* USART_CR1_UESM */ } #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -2636,6 +2744,7 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) UART_ClockSourceTypeDef clocksource; uint32_t usartdiv = 0x00000000U; HAL_StatusTypeDef ret = HAL_OK; + uint32_t pclk; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); @@ -2683,21 +2792,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2720,21 +2831,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2858,12 +2971,24 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) return HAL_TIMEOUT; } } +#if defined(USART_ISR_REACK) + + /* Check if the Receiver is enabled */ + if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } +#endif /* Initialize the UART State */ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2878,7 +3003,8 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) * @param Timeout Timeout duration * @retval HAL status */ -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) @@ -2895,11 +3021,32 @@ HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_TIMEOUT; } + + if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET) + { + /* Clear Receiver Timeout flag*/ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ + CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); + CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ErrorCode = HAL_UART_ERROR_RTO; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } } } return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c index 415fb56b..fcbcf4fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c @@ -57,6 +57,9 @@ /** @defgroup UARTEx_Private_Functions UARTEx Private Functions * @{ */ +#if defined(USART_CR1_UESM) +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +#endif /* USART_CR1_UESM */ /** * @} */ @@ -144,7 +147,8 @@ * oversampling rate). * @retval HAL status */ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime) +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime) { uint32_t temp; @@ -224,42 +228,74 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @} */ -/** @defgroup UARTEx_Exported_Functions_Group2 IO operation functions - * @brief Extended functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of Wakeup and FIFO mode related callback functions. - -@endverbatim - * @{ - */ - - -/** - * @} - */ /** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions * @brief Extended Peripheral Control functions - * + * @verbatim =============================================================================== ##### Peripheral Control functions ##### =============================================================================== [..] This section provides the following functions: + (+) HAL_UARTEx_EnableClockStopMode() API enables the UART clock (HSI or LSE only) during stop mode + (+) HAL_UARTEx_DisableClockStopMode() API disables the above functionality (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address detection length to more than 4 bits for multiprocessor address mark wake up. +#if defined(USART_CR1_UESM) + (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode + trigger: address match, Start Bit detection or RXNE bit status. + (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode + (+) HAL_UARTEx_DisableStopMode() API disables the above functionality +#endif @endverbatim * @{ */ +#if defined(USART_CR3_UCESM) +/** + * @brief Keep UART Clock enabled when in Stop Mode. + * @note When the USART clock source is configured to be LSE or HSI, it is possible to keep enabled + * this clock during STOP mode by setting the UCESM bit in USART_CR3 control register. + * @note When LPUART is used to wakeup from stop with LSE is selected as LPUART clock source, + * and desired baud rate is 9600 baud, the bit UCESM bit in LPUART_CR3 control register must be set. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + /* Set UCESM bit */ + SET_BIT(huart->Instance->CR3, USART_CR3_UCESM); + /* Process Unlocked */ + __HAL_UNLOCK(huart); + return HAL_OK; +} + +/** + * @brief Disable UART Clock when in Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UCESM bit */ + CLEAR_BIT(huart->Instance->CR3, USART_CR3_UCESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR3_UCESM */ /** * @brief By default in multiprocessor mode, when the wake up method is set * to address mark, the UART handles only 4-bit long addresses detection; @@ -299,8 +335,108 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua return (UART_CheckIdleState(huart)); } +#if defined(USART_CR1_UESM) +/** + * @brief Set Wakeup from Stop mode interrupt flag selection. + * @note It is the application responsibility to enable the interrupt used as + * usart_wkup interrupt source before entering low-power mode. + * @param huart UART handle. + * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUP_ON_ADDRESS + * @arg @ref UART_WAKEUP_ON_STARTBIT + * @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + /* check the wake-up from stop mode UART instance */ + assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); + /* check the wake-up selection parameter */ + assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the wake-up selection scheme */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); + + if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) + { + UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); + } + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* Init tickstart for timeout managment*/ + tickstart = HAL_GetTick(); + + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + status = HAL_TIMEOUT; + } + else + { + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Enable UART Stop Mode. + * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set UESM bit */ + SET_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable UART Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UESM bit */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -312,6 +448,25 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua /** @addtogroup UARTEx_Private_Functions * @{ */ +#if defined(USART_CR1_UESM) + +/** + * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. + * @param huart UART handle. + * @param WakeUpSelection UART wake up from stop mode parameters. + * @retval None + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); + + /* Set the USART address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); + + /* Set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); +} +#endif /* USART_CR1_UESM */ /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_GCC/Prog/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.out b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.out index a9b4e1a2a4138403079db0088948aaa79c88e5bb..cb7f13c56de76d0b6b37fd3ae724da231d31fa6b 100644 GIT binary patch literal 623132 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 z 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 literal 619576 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 ZT&Ebg?i;7O1$7D1SnY)P?d%;>Qg(jk(_vun(j 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 diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec index a778048e..df9ad22b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/bin/openblt_stm32f746.srec @@ -1,1537 +1,1562 @@ S01900006F70656E626C745F73746D3332663734362E73726563F8 -S3150800000020140020795D0008AD5D0008B15D000888 -S31508000010B55D0008B95D0008BD5D00080000000078 -S31508000020000000000000000000000000C15D00089C -S31508000030C55D000800000000C95D0008BD10000885 -S31508000040CD5D0008D15D0008D55D0008D95D0008C2 -S31508000050DD5D0008E15D0008E55D0008E95D000872 -S31508000060ED5D0008F15D0008F55D0008F95D000822 -S31508000070FD5D0008015E0008055E0008095E0008CF -S315080000800D5E0008115E0008155E0008195E00087E -S315080000901D5E0008215E0008255E0008295E00082E -S315080000A02D5E0008315E0008355E0008395E0008DE -S315080000B03D5E0008415E0008455E0008495E00088E -S315080000C04D5E0008515E0008555E0008595E00083E -S315080000D05D5E0008615E0008655E0008695E0008EE -S315080000E06D5E0008715E0008755E0008795E00089E -S315080000F07D5E0008815E0008855E0008895E00084E -S315080001008D5E0008915E0008955E0008995E0008FD -S315080001109D5E0008A15E0008A55E0008A95E0008AD -S31508000120AD5E0008B15E0008B55E0008B95E00085D -S31508000130BD5E0008C15E0008C55E0008C95E00080D -S31508000140CD5E0008D15E0008D55E0008D95E0008BD -S31508000150DD5E0008E15E0008E55E0008E95E00086D -S31508000160ED5E0008F15E0008F55E0008F95E00081D -S31508000170FD5E0008015F0008055F0008000000003A -S31508000180095F00080D5F0008115F0008155F000889 -S31508000190195F00081D5F0008215F0008255F000839 -S315080001A0295F00082D5F0008315F0008355F0008E9 -S315080001B0395F00083D5F0008415F0008455F000899 -S315080001C0495F00084D5F00080EB418B5040008988A +S3150800000050140020055F0008395F00083D5F0008AE +S31508000010415F0008455F0008495F000800000000CE +S315080000200000000000000000000000004D5F00080E +S31508000030515F000800000000555F000871110008B4 +S31508000040595F00085D5F0008615F0008655F00088A +S31508000050695F00086D5F0008715F0008755F00083A +S31508000060795F00087D5F0008815F0008855F0008EA +S31508000070895F00088D5F0008915F0008955F00089A +S31508000080995F00089D5F0008A15F0008A55F00084A +S31508000090A95F0008AD5F0008B15F0008B55F0008FA +S315080000A0B95F0008BD5F0008C15F0008C55F0008AA +S315080000B0C95F0008CD5F0008D15F0008D55F00085A +S315080000C0D95F0008DD5F0008E15F0008E55F00080A +S315080000D0E95F0008ED5F0008F15F0008F55F0008BA +S315080000E0F95F0008FD5F0008016000080560000868 +S315080000F0096000080D600008116000081560000816 +S31508000100196000081D6000082160000825600008C5 +S31508000110296000082D600008316000083560000875 +S31508000120396000083D600008416000084560000825 +S31508000130496000084D6000085160000855600008D5 +S31508000140596000085D600008616000086560000885 +S31508000150696000086D600008716000087560000835 +S31508000160796000087D6000088160000885600008E5 +S31508000170896000088D600008916000080000000092 +S3150800018095600008996000089D600008A160000855 +S31508000190A5600008A9600008AD600008B160000805 +S315080001A0B5600008B9600008BD600008C1600008B5 +S315080001B0C5600008C9600008CD600008D160000865 +S315080001C0D5600008D96000080EB418B50400089870 S315080001D0012817D1A06B30F48030A063E168DFF8FE -S315080001E078080140E160E06830F44010E0600F985C +S315080001E030090140E160E06830F44010E0600F98A3 S315080001F0012803D1E06850F48010E060200000F088 -S31508000200F0FE0AE0E06850F04000E060200000F0F0 -S31508000210E8FEA16B51F48031A1630699012907D143 +S315080002004BFF0AE0E06850F04000E060200000F094 +S3150800021043FFA16B51F48031A1630699012907D1E7 S31508000220A16851F00601A160A16851F02001A16002 S31508000230C0B212BC5DF810FB1300DBB2022B52D120 -S31508000240DFF818288A1ADFF818389A4201D20F21DF -S315080002504FE0DFF810288A1ADFF80C389A4201D2E4 -S315080002600E2146E0DFF804288A1ADFF804389A4295 -S3150800027001D20D213DE0DFF8FC278A1ADFF8F837AE -S315080002809A4201D20C2134E0DFF8F0278A1ADFF807 -S31508000290F0379A4201D20B212BE0DFF8E8278A1AB9 -S315080002A0DFF8E4379A4201D20A2122E0DFF8DC2798 -S315080002B08A1ADFF8DC379A4201D2092119E0DFF8F9 -S315080002C0D4278A1ADFF8D0379A4201D2082110E0DB -S315080002D0DFF8C827891ADFF8C827914201D2072113 +S31508000240DFF8D0288A1ADFF8D0389A4201D20F216F +S315080002504FE0DFF8C8288A1ADFF8C4389A4201D274 +S315080002600E2146E0DFF8BC288A1ADFF8BC389A4225 +S3150800027001D20D213DE0DFF8B4288A1ADFF8B0383C +S315080002809A4201D20C2134E0DFF8A8288A1ADFF84E +S31508000290A8389A4201D20B212BE0DFF8A0288A1A47 +S315080002A0DFF89C389A4201D20A2122E0DFF8942826 +S315080002B08A1ADFF894389A4201D2092119E0DFF840 +S315080002C08C288A1ADFF888389A4201D2082110E069 +S315080002D0DFF88028891ADFF88028914201D20721A1 S315080002E007E0062105E0D2B2002A01D1092100E083 S315080002F00921C26832F47052C260C268890211F4D8 S3150800030070511143C16000207047816851F00101A6 S315080003108160002070478168490849008160002093 S31508000320704780B5C26832F0C042C2600A00D2B2D5 S31508000330012A08D1C16851F00051C160322000F08D -S3150800034077FE002002BDC9B2002904D1C16851F068 +S31508000340D1FE002002BDC9B2002904D1C16851F00E S315080003508041C160F2E70120F4E70EB478B50400E5 S3150800036000252600002005E0002104EB8002C2F8E3 -S315080003700411401C0F28F7D30F9800280CD1A06B46 -S3150800038030F40010A063206850F040002060206818 -S3150800039050F08000206003E0A06B50F40010A063CA -S315080003A0002016F56061086016F50060006816F50D -S315080003B0006108600A9801280CD10798002804D122 -S315080003C00021200000F0F7F818E00121200000F0D5 -S315080003D0F2F813E00A9803280CD10798002804D1EC -S315080003E00021200000F0E7F808E00121200000F0D5 -S315080003F0E2F803E00321200000F0DDF810212000D8 -S3150800040000F0B9F8002800D00125200000F0C4F853 -S31508000410002800D00125002016F50061086100209B -S3150800042016F500614861002016F50061C8610020D4 -S315080004301BE0002116EB401212F51062116006E06F -S315080004405FF0904116EB401212F51062116016EB40 -S31508000450401111F5106100220A6116EB401111F5E1 -S3150800046010614FF67F328A60401C0599884210D287 -S3150800047016EB401111F5106109680029D9D5002835 -S31508000480DED15FF0006116EB401212F510621160C2 -S31508000490DDE700201BE0002116EB401212F5306262 -S315080004A0116006E05FF0904116EB401212F53062DB -S315080004B0116016EB401111F5306100220A6116EB46 -S315080004C0401111F530614FF67F328A60401C05995C -S315080004D0884210D216EB401111F5306109680029DF -S315080004E0D9D50028DED15FF0006116EB401212F56F -S315080004F030621160DDE716F50060006930F480703F -S3150800050016F500610861089801280ED1DFF8040B7A -S3150800051016F50061086316F50060006B40F480303C -S3150800052050F0030016F5006630630020A0617FF0E6 -S31508000530804060610898002803D1A06950F0100037 -S31508000540A061A169DFF8D00A0143A1610B980028D0 -S3150800055003D0A06950F00800A0610F98012805D1C2 -S31508000560A06940F0804050F00400A0612800C0B2A5 -S3150800057072BC5DF810FB0022890151F0200101616F -S31508000580521CDFF8981A8A4204D201698906F7D400 -S31508000590002070470320FCE7002110220261491C55 -S315080005A0DFF8782A914204D20269D206F7D40020ED -S315080005B070470320FCE710F500621268C9B21143C0 -S315080005C010F5006001600020704710F50060806833 -S315080005D010F00600002801D1002006E0022801D00C -S315080005E0062801D1022000E00020C0B2704730B4CE -S315080005F00A784B78012B2BD110F50063DB690124AF -S315080006000D7815F00F05AC40A4B2234310F500642D -S31508000610E36110EB421313F510631B681B0440D407 -S3150800062010EB421313F510631B688C686405640DA0 -S31508000630C97854EA814454EA825444F0805454F404 -S315080006400044234310EB421010F51060036028E0C5 -S3150800065010F50063DB6901240D7815F00F05AC4031 -S3150800066053EA044310F50064E36110EB421313F5F3 -S3150800067030631B681B0414D410EB421313F5306364 -S315080006801B688C686405640DC97854EA814444F093 -S31508000690805454F40044234310EB421010F53060A4 -S315080006A00360002030BC704730B40A784B78012BC1 -S315080006B028D1012310F50064E46B0D7815F00F05B9 -S315080006C013FA05F5ADB2AC4310F50065EC6310F509 -S315080006D00064E469097811F00F018B409BB234EA93 -S315080006E0030310F50061CB6110EB421111F510619F -S315080006F00B68DFF82C190B4010EB421010F5106050 -S31508000700036026E0012310F50064E46B0D7815F00C -S315080007100F0513FA05F534EA054410F50065EC6390 -S3150800072010F50064E469097811F00F018B4034EA8A -S31508000730034410F50061CC6110EB421111F53061EC -S315080007400B68DFF8E0180B4010EB421010F530602C -S315080007500360002030BC7047F8B504000D784B786C -S31508000760012B40F0DD804B69002B24D114EB451397 -S3150800077013F5106314EB451616F5106636696FF314 -S31508000780DC461E6114EB451313F5106314EB45168E -S3150800079016F51066366956F400261E6114EB4513E5 -S315080007A013F5106314EB451616F510663669F60C44 -S315080007B0F6041E615AE014EB451313F5106314EBA7 -S315080007C0451616F510663669F60CF6041E6114EB26 -S315080007D0451313F5106314EB451616F510663669BE -S315080007E06FF3DC461E6114EB451616F5106614EB1E -S315080007F0451313F510631F69D1F814C08B6813EB02 -S315080008000C0CBCF1010C8B68BCFBF3F3DFF818C8C1 -S315080008101CEAC34C5CEA0707376114EB451313F56A -S31508000820106314EB451616F5106636694F697F0393 -S315080008307F0B3E431E61CB78012B17D114EB451372 -S3150800084013F5106314EB451616F51066366936F07F -S31508000850C0461E6114EB451313F5106314EB4516D9 -S3150800086016F51066366956F000561E611300DBB29F -S31508000870012B09D10B69002B18D014EB451313F57E -S3150800088010630E695E6111E0CB78012B0ED04B69BF -S31508000890002B0BD014F500635B6B01260F7817F05D -S315080008A00F07BE40334314F500667363CB78012BFC -S315080008B01DD114F500639B68DB050CD414EB4513B6 -S315080008C013F510631B6853F0005314EB451616F521 -S315080008D0106633600BE014EB451313F510631B68C1 -S315080008E053F0805314EB451616F51066336014EB77 -S315080008F0451313F510631B6853F0044314EB4514B2 -S3150800090014F510642360CB78012B40F0A280D2B294 -S3150800091000924B699BB20A78C96800F0A5F998E07D -S3150800092014EB451010F5306014EB451313F53063DE -S315080009301B69DB0CDB04036114EB451010F5306012 -S3150800094014EB451313F530631B696FF3DC4303613E -S31508000950486900281AD114EB451010F5306014EBDD -S31508000960451313F530631B698E687603760B33439C -S31508000970036114EB451010F5306014EB451313F5BD -S3150800098030631B6953F40023036129E04B698868C7 -S31508000990C3185B1E8868B3FBF0F014EB451313F518 -S315080009A0306314EB451616F5306636690700BFB294 -S315080009B0DFF874C61CEAC74C5CEA06061E6114EB2F -S315080009C0451313F5306314EB451616F5306636698C -S315080009D08F6880B200FB07F04003400B3043186174 -S315080009E0D2B2012A08D1C868002805D014EB4510F0 -S315080009F010F53060CA684261C87801281DD114F51F -S31508000A0000608068C0050CD414EB451010F5306002 -S31508000A10006850F0005014EB451111F5306108607C -S31508000A200BE014EB451010F53060006850F080506C -S31508000A3014EB451111F53061086014EB451010F5FB -S31508000A403060006850F0044014EB451414F5306427 -S31508000A5020600020F2BD0000BFFFBDFFC0ACD8007B -S31508000A6000350C00C0E1E40040420F000024F40009 -S31508000A70804F12008073060120D61300A0491A0180 -S31508000A8060E31600002D310140771B0040A44C019D -S31508000A90C091210000366E012075380020ABA601F2 -S31508000AA0E09C410070B40B001C785978012940F08D -S31508000AB089805969002924D110EB441111F5106178 -S31508000AC010EB441515F510652D696FF3DC450D61BE -S31508000AD010EB441111F5106110EB441515F510656E -S31508000AE02D6955F400250D6110EB441111F51061BF -S31508000AF010EB441515F510652D69ED0CED040D6127 -S31508000B0037E010EB441111F5106110EB441515F59B -S31508000B1010652D69ED0CED040D6110EB441111F50E -S31508000B20106110EB441515F510652D696FF3DC455A -S31508000B300D6199685D69A94201D29968596110EBFE -S31508000B40441111F5106110EB441515F510652D6962 -S31508000B5055F400250D6110EB441111F5106110EBE9 -S31508000B60441515F510652D695E697603760B3543D0 -S31508000B700D61D2B2012A09D11969002915D010EBE5 -S31508000B80441111F510611A694A610EE05969002984 -S31508000B900BD010F50061496B01221B7813F00F0387 -S31508000BA09A40114310F50062516310EB441111F598 -S31508000BB01061096851F0044110EB441010F51060FB -S31508000BC001604EE010EB441111F5306110EB44154D -S31508000BD015F530652D69ED0CED040D6110EB44112A -S31508000BE011F5306110EB441515F530652D696FF375 -S31508000BF0DC450D615969002901D09968596110EBE6 -S31508000C00441111F5306110EB441515F530652D6961 -S31508000C1055F400250D6110EB441111F5306110EB08 -S31508000C20441515F530652D699E687603760B3543B0 -S31508000C300D61D2B2012A08D1D968002905D010EB76 -S31508000C40441111F53061DA684A6110EB441111F567 -S31508000C503061096851F0044110EB441010F530601A -S31508000C600160002070BC7047F0B4049CE4B2002C0C -S31508000C7012D19BB2DB1C9B0800250BE00E681700FF -S31508000C80FFB24FF4805404FB070717F580573E6000 -S31508000C90091D6D1C9D42F1D30020F0BC704710B4AD -S31508000CA092B2D21C9208002305E010F580542468FD -S31508000CB00C60091D5B1C9342F7D3080010BC7047F3 -S31508000CC0020008784978012921D112EB401111F563 -S31508000CD01061096800290DD400280BD012EB4011C9 -S31508000CE011F51061096831F0804112EB401313F5D4 -S31508000CF01063196012EB401111F51061096851F47F -S31508000D00001112EB401212F51062116020E012EB8E -S31508000D10401111F53061096800290DD400280BD05F -S31508000D2012EB401111F53061096831F0804112EB80 -S31508000D30401313F53063196012EB401111F5306159 -S31508000D40096851F4001112EB401212F53062116075 -S31508000D500020704710B40A784B78012B1ED110EB8F -S31508000D60421313F510631B6833F4001310EB421497 -S31508000D7014F510642360CB78032B02D0C9780229B6 -S31508000D802AD110EB421111F51061096851F0805112 -S31508000D9010EB421010F5106001601DE010EB4213D5 -S31508000DA013F530631B6833F4001310EB421414F583 -S31508000DB030642360CB78032B02D0C97802290BD183 -S31508000DC010EB421111F53061096851F0805110EBB2 -S31508000DD0421010F530600160002010BC704710B555 -S31508000DE00400200000210CE04FF67F3210EB41137F -S31508000DF013F510639A6010EB411313F530639A608C -S31508000E00491C0F29F0D3002110F500621161002159 -S31508000E1010F500625161002110F50060C1612000E3 -S31508000E20FFF7BAFB0100C9B2002901D0C0B20AE037 -S31508000E3010212000FFF79FFB0100C9B2002901D04D -S31508000E40C0B200E0C0B210BD10F50062126832F4FC -S31508000E50FE6210F500631A6010F500621268C9B2E6 -S31508000E60090111F4FE61114310F5006001600020CC -S31508000E70704780B510F50061496831F0020110F538 -S31508000E8000604160032000F0D3F8002002BD80B561 -S31508000E9010F50061496851F0020110F500604160E3 -S31508000EA0032000F0C5F8002002BD010048698969E1 -S31508000EB008407047010011F50060806911F500616E -S31508000EC0C9690840000C7047010011F50060806987 -S31508000ED011F50061C969084080B270470200C9B2BD -S31508000EE012EB411010F53060806812F50062516906 -S31508000EF00840704710B410F50062126910F50063D7 -S31508000F005B6B11F00F04E340DB0113F080031A4317 -S31508000F10C9B210EB411010F510608068104010BC83 -S31508000F207047406910F00100704710F510610968B4 -S31508000F30C90AC90210F51062116010F500618968C6 -S31508000F4011F00601042907D110F51061096851F05E -S31508000F50030110F51062116010F50061496851F43B -S31508000F60807110F5006041600020704710B40300DE -S31508000F70006CDFF8B840A04206D313F5306000686D -S31508000F80002801D500202AE0002013F530642061EE -S31508000F9013F53060006950F4002013F530642061C1 -S31508000FA013F53060006950F0180013F530642061BD -S31508000FB013F53060006950F0C04013F530642061C5 -S31508000FC0C9B201290AD113F53060426113F53060C0 -S31508000FD0006850F0802013F530631860002010BCBC -S31508000FE070470021491C0D4A91420FD20369002B14 -S31508000FF0F8D50021036953F001030361491C9142A6 -S3150800100006D20369DB07F9D4002070470320FCE702 -S315080010100320FAE70001800000383C80410D0300F8 -S31508001020007833EC0078F3EF0000F81F0B30544FCC -S3150800103038B5040000F03EF8050014F1010F02D09F -S3150800104004480078241800F035F8401BA042FAD36B -S3150800105031BD00BFBD00002080B500F00DF8104876 -S315080010601049086000201049086005200F490860EB -S3150800107000200F49086001BD00200C490860704730 -S315080010800A480068C00303D509480168491C01607D -S31508001090704780B5FFF7F4FF0548006802BD0000F9 -S315080010A0BF4B030014E000E018E000E010E000E0A9 -S315080010B00410002080B5FFF7ECFF02BD704730B47E -S315080010C0002513E050F8042BD30744BFA9F1010308 -S315080010D09A18091F042942F8045BFAD213468C07AA -S315080010E044BF15809B1CC90748BF1D7050F8041BD8 -S315080010F00029E7D130BC704710B58AB00400002C2F -S3150800110001D10120B0E094F8BD03002805D10020E4 -S3150800111084F8BC03200000F051FE032084F8BD03C8 -S315080011202068FFF7F8F8211D83B06846342200F0DE -S3150800113047FE0EBC2068FFF747F8002804D00220B7 -S3150800114084F8BD0301208FE000212068FFF7E9F845 -S31508001150002130E01C200A00D2B242432244012377 -S3150800116082F83D300A00D2B24243224482F83C104B -S315080011700A00D2B2424322440B00DBB2A2F8423044 -S315080011800A00D2B242432244002382F83F300A00C2 -S31508001190D2B242432244002353640A00D2B24243E5 -S315080011A02244002393640A00D2B200FB02F02044D2 -S315080011B000220265491C0800C0B262689042C9D381 -S315080011C000212BE01C200A00D2B24243224400230D -S315080011D082F8FD310A00D2B24243224482F8FC1159 -S315080011E00A00D2B242432244002382F8FF310A00A1 -S315080011F0D2B2424322440023C2F804320A00D2B2D1 -S31508001200424322440023C2F808320A00D2B200FB45 -S3150800121002F020440022C0F81022491C0800C0B27F -S3150800122062689042CED3211D83B06846342200F00E -S31508001230C7FD0EBC2068FFF790F8002804D00220EE -S3150800124084F8BD0301200FE0002084F8380001204F -S3150800125084F8BD03606A012802D1200000F029FE47 -S315080012602068FFF714FE00200AB010BD10B5040070 -S31508001270002C01D101200CE0032084F8BD032000D6 -S3150800128000F01EF8200000F028FE002084F8BD03B8 -S31508001290002010BD10B5040094F8BC03012801D144 -S315080012A002200CE0012084F8BC032068FFF7E1FD6A -S315080012B02068FFF72AF8002084F8BC03002010BD38 -S315080012C010B5040094F8BC03012801D1022016E0E9 -S315080012D0012084F8BC032068FFF71DF82068FFF793 -S315080012E07EFD002804D0002084F8BC03012006E017 -S315080012F02068FFF7CCFD002084F8BC03002010BD51 -S315080013002DE9F84306003768B84600243068FFF729 -S3150800131008FE002840F06C823068FFF7C6FD0028FA -S3150800132000F066823068FFF7C0FD800705D5306893 -S31508001330406910F00200316848613068FFF7B5FD72 -S31508001340000350D500243068FFF7B4FD050048E0D7 -S31508001350E80744D52100C9B23068FFF7BFFD8146CA -S315080013605FEAC97009D518EB441010F53060012101 -S3150800137081602100300000F046FC5FEA097009D55B -S315080013802100300000F0DEFC18EB441010F5306048 -S31508001390082181605FEAC96005D518EB441010F58D -S315080013A03060102181605FEA89600ED530690128B6 -S315080013B005D116F5717201213068FFF7D7FD18EBD4 -S315080013C0441010F53060202181605FEA894006D517 -S315080013D018EB441010F530604FF400518160641C1E -S315080013E06D08002DB4D13068FFF75FFD40037AD54C -S315080013F03068FFF769FD0500002472E0E8076ED53E -S315080014002100C9B23068FFF775FD81465FEAC970E9 -S315080014103AD5012114F00F0011FA00F018F5006111 -S31508001420496B31EA000018F50061486318EB44106F -S3150800143010F5106001218160306901280DD11C204A -S3150800144000FB04F13144896C00FB04F23244526C0F -S31508001450114400FB04F0304481642100C9B2300015 -S3150800146000F053FD306901280ED1002C0CD11C2048 -S3150800147000FB04F03044006D002805D116F57172A2 -S3150800148001213068FFF772FD5FEA097005D518EB90 -S31508001490441010F51060082181605FEAC96005D51F -S315080014A018EB441010F51060102181605FEA49605E -S315080014B005D518EB441010F51060402181605FEAED -S315080014C0897005D518EB441010F51060022181606B -S315080014D05FEA096003D52100300000F020FB641C98 -S315080014E06D08002D8AD13068FFF7DFFC00281CD56F -S315080014F018F5006040684008400018F5006148602B -S3150800150096F8F403012807D1002086F8F403002191 -S31508001510300000F0E1FC02E0300000F041FD3068E8 -S31508001520406910F00040316848613068FFF7BDFC3B -S3150800153000050DD518F500608068C00702D5300093 -S3150800154000F013FD3068406910F4006031684861A6 -S315080015503068FFF7AAFC00011AD53068406910F018 -S3150800156000603168486196F8F40300280DD101201F -S3150800157086F8F4033068406DC0F38300C6F8F803B4 -S315080015800121300000F0A8FC02E0300000F0EDFC7C -S315080015903068FFF78AFCC0047BD518F50060406800 -S315080015A04008400018F50061486010213068FEF7D1 -S315080015B0E2FF002024E04FF67F3118EB401212F5C7 -S315080015C01062916018EB401212F51062126832F43C -S315080015D0001218EB401313F510631A6018EB40124B -S315080015E012F53062916018EB401111F53061096807 -S315080015F031F4001118EB401212F530621160401CEC -S3150800160071688842D7D318F50060C06950F0011098 -S3150800161018F50061C861306B002812D018F5006013 -S31508001620D0F8840050F00B0018F50061C1F884006A -S3150800163018F50060406C50F00B0018F5006148641E -S3150800164011E018F50060406940F4005050F02B0096 -S3150800165018F50061486118F50060006950F00B0044 -S3150800166018F50061086118F50060006830F4FE603E -S3150800167018F50068C8F8000016F571723169C9B224 -S315080016803068FFF773FC3068406910F480503168A1 -S3150800169048613068FFF709FC800417D53068FFF702 -S315080016A044FC3068FEF791FFF06000F09FFD0100F2 -S315080016B0F268D2B23068FEF7BFFD300000F039FCA0 -S315080016C03068406910F40050316848613068FFF7A7 -S315080016D0ECFBC0063FD53068806930F010003168F1 -S315080016E08861D7F8208018F00F011C20414306EBCB -S315080016F0010010F5FE75C8F34340022816D147F6D7 -S31508001700F07018EA000F20D0C8F30A1292B2E968FE -S315080017103800FFF7C4FAE868C8F30A110844E86015 -S31508001720A969C8F30A104118A9610EE0C8F3434035 -S3150800173006280AD1082216F571713800FFF7AFFAA4 -S31508001740A969C8F30A104118A9613068806950F080 -S315080017501000316888613068FFF7A7FB000708D5D5 -S31508001760300000F0E0FB3068406910F0080031688E -S3150800177048613068FFF799FBC0020AD52100C9B253 -S31508001780300000F01DFC3068406910F480103168A4 -S3150800179048613068FFF789FB80020AD52100C9B283 -S315080017A0300000F006FC3068406910F4001031681B -S315080017B048613068FFF779FB400008D5300000F033 -S315080017C006FC3068406910F080403168486130682E -S315080017D0FFF76BFB40070BD530684468600702D5F6 -S315080017E0300000F0FEFB306840680443306844600F -S315080017F0BDE8F18310B5040094F8BC03012801D1B3 -S31508001800022009E0012084F8BC032068FFF731FBB9 -S31508001810002084F8BC03002010BD10B5040094F81D -S31508001820BC03012801D1022009E0012084F8BC0389 -S315080018302068FFF72CFB002084F8BC03002010BDAD -S3150800184010B5040094F8BC03012801D102200CE06D -S31508001850012084F8BC0384F83810C9B22068FFF761 -S31508001860F3FA002084F8BC03002010BD70B505000B -S3150800187000260800C0B200060CD50C00E4B214F02D -S315080018800F041C20444305EB040010F13C0401201E -S3150800189060700BE00C00E4B214F00F041C20444303 -S315080018A005EB040010F5FE740020607011F00F01BE -S315080018B0217092B2A260E3706078002801D0207887 -S315080018C0E080DBB2022B01D10020207195F8BC0321 -S315080018D0012801D102200BE0012085F8BC03210074 -S315080018E02868FEF784FE002085F8BC033000C0B2E5 -S315080018F070BD10B504000800C0B200060BD50A007A -S31508001900D2B212F00F021C20424304EB02003C3014 -S31508001910012242700BE00A00D2B212F00F021C201C -S31508001920424304EB020010F5FE700022427011F0EB -S315080019300F01017094F8BC13012901D102200AE0B5 -S31508001940012184F8BC1301002068FEF7ADFE0020D3 -S3150800195084F8BC03002010BD38B51C000D00EDB29C -S3150800196015F00F051C235D4300EB050313F5FE7305 -S31508001970DA605C6100249C6100245C7011F00F043D -S315080019801C700469012C00D11A6111F00F0F06D1E1 -S315080019900269D2B219000068FFF784F805E0026907 -S315080019A0D2B219000068FEF7D7FE002032BDC9B2D0 -S315080019B011F00F011C2251430844D0F81402704755 -S315080019C038B51C000D00EDB215F00F051C235D435C -S315080019D000EB05033C33DA605C6100249C6101245A -S315080019E05C7011F00F041C700469012C00D11A6197 -S315080019F011F00F0F06D10269D2B219000068FFF77D -S31508001A0051F805E00269D2B219000068FEF7A4FE93 -S31508001A10002032BD38B504000D0060682900C9B23F -S31508001A2011F00F01884201D2012039E02800C0B226 -S31508001A3000060CD52900C9B211F00F011C2041433C -S31508001A4004EB010010F13C010120487009E029006F -S31508001A50C9B21C20414304EB010010F5FE710020B9 -S31508001A6048700120887015F00F00087094F8BC03C0 -S31508001A70012801D1022013E0012084F8BC03206864 -S31508001A80FFF71EF915F00F0F06D114F571722169CB -S31508001A90C9B22068FFF76AFA002084F8BC03002060 -S31508001AA032BD10B5040060680A00D2B212F00F0207 -S31508001AB0904201D2012031E00800C0B200060BD5E1 -S31508001AC00A00D2B212F00F021C20424304EB0200B5 -S31508001AD03C30012242700BE00A00D2B212F00F022B -S31508001AE01C20424304EB020010F5FE7000224270EF -S31508001AF00022827011F00F01017094F8BC130129BD -S31508001B0001D102200AE0012184F8BC1301002068F3 -S31508001B10FFF720F9002084F8BC03002010BD2DE94A -S31508001B20FC4704000D00266837001C2000FB05F062 -S31508001B30204410F13C08D8F81400D8F81810884248 -S31508001B4001D201205DE0D8F81400D8F81890B0EB5F -S31508001B500909D8F80800484501D2D8F8089019F1BB -S31508001B6003095FEA990926E0D8F81400D8F818A0FE -S31508001B70B0EB0A0AD8F80800504501D2D8F808A0F0 -S31508001B801AF103095FEA99092069C0B20090534621 -S31508001B909BB22A00D2B2D8F80C103000FFF764F8CE -S31508001BA0D8F80C005044C8F80C00D8F818001AEBFE -S31508001BB0000AC8F818A017EB451010F510608069E0 -S31508001BC080B2484509D3D8F81800D8F814108842C6 -S31508001BD003D2D8F814000028C6D1D8F81800D8F8C7 -S31508001BE0141088420CD3012015F00F0510FA05F5DC -S31508001BF017F50060406B30EA050517F500677D6349 -S31508001C000020BDE8F687F8B505000C002868060030 -S31508001C10006C16EB441111F5306189682A69012AAE -S31508001C206ED10A071BD5634A904208D3080406D525 -S31508001C3016EB441010F530604FF40041816028001F -S31508001C4000F04CF915F5717201212868FFF78EF935 -S31508001C5016EB441616F530660820B06070E08A0662 -S31508001C6006D516EB441616F530662020B06067E0F8 -S31508001C7011F0280F64D14F4A904209D3080407D5BA -S31508001C8016EB441616F530664FF40040B06057E080 -S31508001C901C2707FB04F02844D0F8040216EB441668 -S31508001CA016F5306631694903490B401A07FB04F1FA -S31508001CB02944C1F8140207FB04F02844D0F80802A6 -S31508001CC007FB04F12944D1F80412084407FB04F180 -S31508001CD02944C1F808022100C9B2280000F006F913 -S31508001CE0002C2DD17C4305EB0400D0F81002002807 -S31508001CF026D115F5717201212868FFF737F91FE01B -S31508001D002D4A904217D1080407D516EB441616F546 -S31508001D1030664FF40040B06012E0880605D516EB31 -S31508001D20441616F530662020B0602100C9B2280096 -S31508001D3000F0DCF804E02100C9B2280000F0D6F86B -S31508001D400020F2BD38B5040022681000156C10EBAF -S31508001D50411212F5306292682369012B0CD1154B9A -S31508001D609D4215D3120413D510EB411010F53060BF -S31508001D704FF4004181600BE00F4B9D4208D11204DD -S31508001D8006D510EB411010F530604FF40041816024 -S31508001D90200000F0A3F80748854208D320690128E7 -S31508001DA005D114F5717201212068FFF7DFF80020CC -S31508001DB032BD00000B30544F0A31544F70470000B3 -S31508001DC0103A07D330B4B1E83810103AA0E8381002 -S31508001DD0F9D230BC530724BFB1E80810A0E80810B0 -S31508001DE044BF51F8043B40F8043BD20724BF31F8FE -S31508001DF0022B20F8022B44BF0B7803707047121F82 -S31508001E0017D35B0009D151F8043B20F8023B1B0CA1 -S31508001E10121F20F8023BF6D20BE051F8043B00F8FB -S31508001E20013B1B0A20F8023B1B0C121F00F8013B62 -S31508001E30F3D238BF121D521E24BF11F8013B00F819 -S31508001E40013BF8D87047000070B403685B6A0C0061 -S31508001E50E4B2002C05D192B253EA024300688362C9 -S31508001E601FE00468A46A13EB1443002409E005681C -S31508001E702600F6B205EB8605D5F8045113EB154393 -S31508001E80641C2500EDB20E00F6B2761EB542EED3FE -S31508001E900068C9B200EB810092B253EA0243C0F867 -S31508001EA00031002070BC704789B20068416200208A -S31508001EB0704701680122C0F8FC23002280F8F42349 -S31508001EC0886950F000608861486D40F0805050F095 -S31508001ED003004865002070477047704780B510F5C5 -S31508001EE07171D0F8000400F0DDF901BD80B50B0072 -S31508001EF0DBB21C22534300EB0302D2F80822C9B214 -S31508001F00D0F8000400F000FA01BD80B50B00DBB282 -S31508001F101C22534300EB0302926CC9B2D0F80004AA -S31508001F2000F045FA01BD80B5D0F8000400F003FBC7 -S31508001F3001BD38B504000125E068002801D1002557 -S31508001F4008E0E068022801D1012503E0912146480E -S31508001F5000F013FB2900C9B2D4F8000400F0D9FA3E -S31508001F60D4F8000400F0A5FA31BD10B50400D4F881 -S31508001F70000400F0D1FA206810F56060006850F09F -S31508001F800100216811F560610860206A002804D004 -S31508001F903648016851F00601016000F017FB10BDD4 -S31508001FA010B5040000F013FBD4F8000400F0BDFAE5 -S31508001FB010BD80B5C9B2D0F8000400F0CEFA01BD54 -S31508001FC080B5C9B2D0F8000400F0C5FA01BD10B555 -S31508001FD00400012000F0F9FAD4F8000400F0BFFA72 -S31508001FE010BD10B50400002000F0EFFAD4F8000484 -S31508001FF000F0B7FA10BD10B50178002931D11C4C94 -S31508002000C4F80004C0F898425FF0A040206006209B -S3150800201060600220E060002020610220A0610120AB -S31508002020E06100202062002060620020E06200205B -S3150800203020632000FFF760F8002804D040F225113D -S31508002040094800F09AFA80212000FFF72DFF402268 -S3150800205000212000FFF7F8FE802201212000FFF76B -S31508002060F3FE002010BD0000645A000810ED00E0E1 -S31508002070C000002080B500210021D0F89802FFF7A3 -S31508002080F5F8C0B200F09DF8C0B202BD80B50021D7 -S315080020900021D0F89802FFF7FDF8C0B200F091F8D9 -S315080020A0C0B202BD80B500210021D0F89802FFF722 -S315080020B007F9C0B200F085F8C0B202BD10B51C0021 -S315080020C0002300231300DBB2220092B2C9B2D0F873 -S315080020D09802FFF7CBFBC0B200F073F8C0B210BD90 -S315080020E080B500220022C9B2D0F89802FFF701FC99 -S315080020F0C0B200F066F8C0B202BD80B50022002268 -S31508002100C9B2D0F89802FFF785FCC0B200F059F8BA -S31508002110C0B202BD80B500220022C9B2D0F898022A -S31508002120FFF7BFFCC0B200F04CF8C0B202BDD0F851 -S3150800213098220800C0B2000609D5C9B211F07F017D -S315080021401C20414302EB010090F83E0008E0C9B2AA -S3150800215011F07F011C20414302EB010090F8FE01BB -S31508002160704780B500220022C9B2D0F89802FFF75E -S3150800217067FBC0B200F025F8C0B202BD10B5002456 -S3150800218000249BB2C9B2D0F89802FFF719FCC0B276 -S3150800219000F017F8C0B210BD10B5002400249BB299 -S315080021A0C9B2D0F89802FFF7D7FBC0B200F009F819 -S315080021B0C0B210BD80B5C9B2D0F89802FFF7F7FBD8 -S315080021C002BD0021C0B2002805D0022807D004D3DA -S315080021D0032806D007E0002006E0022004E00120DC -S315080021E002E0022000E00220C0B270470148006801 -S315080021F0704700000400002080B5002801D10220A5 -S3150800220011E0D0F88C32002B02D00023C0F88C32B3 -S31508002210002901D0C0F88812012180F874120270D2 -S31508002220FFF7E9FE002002BD10B50400012084F87E -S3150800223074026168C9B22000D4F88C2252689047AB -S315080022402000FFF72FFF2000FFF714FF002010BD26 -S315080022500022002903D0C0F88C12002000E00220DA -S31508002260C0B2704780B5FFF711FF002002BD0020FD -S31508002270704710B50224D0F88C22002A07D0C9B2BC -S31508002280D0F88C2212689047002800D1002420003C -S31508002290C0B210BD80B5C9B2D0F88C22526890473A -S315080022A0002002BD10B5040014F5207000F0C4FC2F -S315080022B00120C4F86C02B4F88602C4F8700294F8D7 -S315080022C0800210F01F00002803D002280DD006D384 -S315080022D011E014F52071200000F07AF912E014F5E7 -S315080022E02071200000F0B1F90CE014F520712000EF -S315080022F000F0E1F906E094F8801211F08001200060 -S31508002300FFF7FBFE002010BD10B5040010000A0000 -S31508002310D2B2002A39D114F5A072D4F86C12032966 -S3150800232027D11169D368994211D2D36811695B1A0A -S31508002330D360D1681369994201D2D26800E0126964 -S3150800234092B20100200000F0E2FC002010BDD4F893 -S315080023508C020069002808D094F87402032804D176 -S315080023602000D4F88C1209698847200000F0D8FCB0 -S31508002370EBE7D4F86C020528E7D10020C4F86C0214 -S3150800238000212000FFF7B9FEDFE7D4F88C02806948 -S3150800239000280AD094F87402032806D1C9B220008E -S315080023A0D4F88C2292699047CFE70220CEE710B581 -S315080023B0040010000A00D2B2002A68D114F11402EF -S315080023C0D4F86C1202294AD11169D368994210D2FD -S315080023D0D36811695B1AD360D26892B201002000F3 -S315080023E000F08CFC0023002200212000FFF7D4FE19 -S315080023F041E090681169B0FBF1F301FB1300002876 -S3150800240017D190681169884213D39068D4F870126E -S3150800241088420ED200220021200000F06FFC002026 -S31508002420C4F870020023002200212000FFF7B4FE42 -S3150800243021E0D4F88C02C068002808D094F8740209 -S31508002440032804D12000D4F88C12C9688847802153 -S315080024502000FFF752FE200000F06DFC0BE0D4F8D8 -S315080024606C02042803D0D4F86C02002803D180211A -S315080024702000FFF742FE94F87802012805D12000D3 -S31508002480FFF7F5FE002084F87802002010BDD4F886 -S315080024908C02406900280AD094F87402032806D1F1 -S315080024A0C9B22000D4F88C2252699047EDE7022081 -S315080024B0ECE710B504004023002200212000FFF7B6 -S315080024C0FDFD0120C4F844014020C4F85001402312 -S315080024D0002280212000FFF7F1FD0120A0614020A5 -S315080024E06062012084F874020020C4F86C0200209F -S315080024F060600020C4F87C02D4F89002002806D058 -S315080025006168C9B22000D4F88C225268904700202E -S3150800251010BD01740020704790F8741280F8751287 -S31508002520042180F874120020704790F8751280F81C -S3150800253074120020704780B590F87412032908D1E8 -S31508002540D0F88C12C969002903D0D0F88C12C96951 -S315080025508847002002BD00207047002070470020F1 -S31508002560704780B5012180F874124168C9B2D0F865 -S315080025708C2252689047002002BD80B500F0EAFB25 -S31508002580FCE7000000690840884201D1012000E00C -S315080025900020C0B2704780B54FF400510548FFF7D8 -S315080025A0F1FF002801D0002002E000F0FEFB012028 -S315080025B002BD00000008024080B5642000F0D3FB8D -S315080025C001BD80B500F0D2FB01BD7047704770476A -S315080025D010B500240A7812F06002002A08D0202AD2 -S315080025E001D0402A2CD1D0F88C229268904729E055 -S315080025F04A78002A18D0012A1CD0032A17D0052A9F -S3150800260009D0062A04D0082A0BD0092A06D014E0D5 -S3150800261000F077F913E000F01CFA10E000F048FA31 -S315080026200DE000F0AFFA0AE000F0CBFA07E000F0A0 -S31508002630E7FA04E000F0EEFA01E000F011FB01E031 -S3150800264000F00EFB2000C0B210BD38B504000D0026 -S315080026500020287810F06000002803D0202801D038 -S31508002660402822D194F87402401E022818D82879E6 -S31508002670022810D229002000D4F88C2292689047AC -S315080026800100E88800280AD1C9B2002907D120002C -S3150800269000F046FB03E02900200000F0E1FA03E021 -S315080026A02900200000F0DCFA03E02900200000F0F1 -S315080026B0D7FA002032BD70B50500002488880A784C -S315080026C012F06002002A0AD0202A02D0402A40F0DE -S315080026D012812800D5F88C22926890470EE10A7874 -S315080026E012F06002202A06D12800D5F88C229268BA -S315080026F09047C0B204E14A78002A6CD0012A3AD041 -S31508002700032A40F0F48095F87422022A02D0032A9C -S3150800271016D02CE00200D2B2002A0DD00200D2B2A6 -S31508002720802A09D00100C9B22800FFF7E6FC8021FB -S315080027302800FFF7E2FC02E0280000F091FA19E011 -S315080027404A88002A0FD10200D2B2002A0BD0020012 -S31508002750D2B2802A07D0C988002904D10100C9B29B -S315080027602800FFF7CAFC280000F0DAFA02E0280081 -S3150800277000F076FABEE095F87422022A02D0032AFF -S3150800278016D024E00200D2B2002A0DD00200D2B23E -S31508002790802A09D00100C9B22800FFF7AEFC8021C3 -S315080027A02800FFF7AAFC02E0280000F059FA11E019 -S315080027B0498800290AD110F07F0F04D00100C9B258 -S315080027C02800FFF7A7FC280000F0AAFA02E0280074 -S315080027D000F046FA8EE095F87422022A02D0032AFF -S315080027E028D080E00200D2B2002A07D00200D2B276 -S315080027F0802A03D0280000F033FA77E00100C9B236 -S31508002800090608D5C0B210F07F00142148432844B1 -S3150800281010F1140107E0C0B210F07F0014214843FC -S31508002820284410F5A071002008600222280000F054 -S3150800283053FA5BE00200D2B212060ED50300DBB2F1 -S3150800284013F00F031422534305EB03029269002A7F -S3150800285013D1280000F004FA48E00300DBB213F0B5 -S315080028600F031422534305EB0302D2F84421002A2E -S3150800287003D1280000F0F4F938E00100C9B20906CE -S315080028800AD50200D2B212F07F0214214A4305EBA0 -S31508002890020111F1140609E00200D2B212F07F0219 -S315080028A014214A4305EB020111F5A0760100C9B2CD -S315080028B0002903D00100C9B2802902D10020306066 -S315080028C00BE00100C9B22800FFF731FC002802D04E -S315080028D00120306001E0002030600222310028002B -S315080028E000F0FAF902E0280000F0BAF902E0280040 -S315080028F000F0B6F902E0280000F0B2F92000C0B2F4 -S3150800290070BD38B504000D00688880B2000AC0B2F0 -S31508002910012808D002281BD003282CD0062865D009 -S31508002920072871D080E06946207CD4F8882212688E -S315080029309047BDF80010002900F08480E988002936 -S3150800294000F08080BDF80010EA88914271D273E0E9 -S31508002950207C002807D16846D4F88C12896A8847F3 -S315080029600221417006E06846D4F88C12C96A884785 -S3150800297002214170DDE7A878002808D0022814D083 -S315080029800CD304281FD017D3052823D029E069467D -S31508002990207CD4F8882252689047CAE76946207C8A -S315080029A0D4F8882292689047F7E76946207CD4F8DD -S315080029B08822D2689047F0E76946207CD4F88822B6 -S315080029C012699047E9E76946207CD4F8882252695B -S315080029D09047E2E76946207CD4F8882292699047B6 -S315080029E0DBE72900200000F03BF931E0207C0028D5 -S315080029F005D16846D4F88C12496B884799E72900AF -S31508002A00200000F02DF923E0207C002807D1684635 -S31508002A10D4F88C12096B88470721417089E7290089 -S31508002A20200000F01DF913E02900200000F018F935 -S31508002A300EE0E988ADF80010BDF80020010020007E -S31508002A4000F04AF9E888002802D1200000F068F969 -S31508002A5031BD38B505008888002825D1C8880028E2 -S31508002A6022D1488880281FD28C7814F07F0495F8E4 -S31508002A707402032803D1280000F0F2F817E085F85D -S31508002A8076422100C9B22800FFF76BFB280000F048 -S31508002A9047F9E4B2002C03D0022085F8740206E058 -S31508002AA0012085F8740202E0280000F0D9F831BD4B -S31508002AB070B504000D00324E6888307030780228F0 -S31508002AC004D32900200000F0CBF857E094F87402EC -S31508002AD0022802D003281BD048E03078002813D0FB -S31508002AE030786060032084F8740231782000FFF79C -S31508002AF0C0FB022804D12900200000F0B1F83DE00F -S31508002B00200000F00DF902E0200000F009F935E098 -S31508002B10307800280CD1022084F87402307860607E -S31508002B2031782000FFF7B6FB200000F0F9F81CE02A -S31508002B3030786168884215D06168C9B22000FFF70D -S31508002B40A9FB3078606031782000FFF792FB0228F5 -S31508002B5004D12900200000F083F80FE0200000F0DF -S31508002B60DFF802E0200000F0DBF807E0290020008B -S31508002B7000F076F831782000FFF78CFB70BD000076 -S31508002B801810002080B5CA88012A02D000F068F81B -S31508002B9016E090F87422521E012A02D9921E08D015 -S31508002BA00CE000218160012210F1080100F094F880 -S31508002BB006E00122011D00F08FF801E000F050F850 -S31508002BC001BD80B590F87422521E022A15D8CA880B -S31508002BD0022A02D000F044F811E00121C160D0F8C1 -S31508002BE07C12002903D0C16851F00201C16002229B -S31508002BF010F10C0100F070F801E000F031F801BDA9 -S31508002C0080B54988012904D10121C0F87C1200F059 -S31508002C1087F801BD80B590F87422521E022A08D89A -S31508002C204988012904D10021C0F87C1200F078F8FF -S31508002C3001E000F015F801BD0A7802704A78427082 -S31508002C408A78CB781B029A1842800A794B791B023C -S31508002C509A1882808A79C97909028918C1807047C9 -S31508002C6010B5040080212000FFF747FA0021200054 -S31508002C70FFF743FA10BDF8B504000D00170000264B -S31508002C80002C1ED0200000F01DF84000801C388063 -S31508002C9038783100C9B26854761C03203100C9B2AD -S31508002CA06854761C0AE020783100C9B26854641C5E -S31508002CB0761C00203100C9B26854761C207800289A -S31508002CC0F1D1F1BD0200002001E0401C521C117830 -S31508002CD00029FAD1C0B2704780B513000222C0F8A5 -S31508002CE06C221A0092B2C2611A0092B202629BB2B8 -S31508002CF00A000021FFF742FA002002BD80B5130042 -S31508002D009BB20A000021FFF739FA002002BD80B500 -S31508002D1013009BB20A000021FFF73EFA002002BD0D -S31508002D2080B50421C0F86C12002300220021FFF7A9 -S31508002D3025FA002002BD80B50521C0F86C120023D3 -S31508002D4000220021FFF728FA002002BD80B5FFF710 -S31508002D5033FC01BD80B5FFF734FC01BD81617047C6 -S31508002D6009048161704714490880704710B5FEF759 -S31508002D7090F9124C2168884216D311490878002820 -S31508002D8006D10120087080210E48FFF7E7FF05E00D -S31508002D900020087080210B48FFF7E2FFFEF779F95B -S31508002DA0054909884018206010BD80B5802105486E -S31508002DB0FFF7D6FF01BD000010100020FC0F002011 -S31508002DC0131000200004024038B50400002C01D17D -S31508002DD00120AEE094F82000002802D1200000F07F -S31508002DE0B0FA2068006830F0020021680860FEF733 -S31508002DF061F905002068406880070DD5FEF75AF985 -S31508002E00401B0B28F6D3606A50F400306062052038 -S31508002E1084F8200001208CE02068006850F001004A -S31508002E2021680860FEF746F9050020684068C00773 -S31508002E300DD4FEF73FF9401B0B28F6D3606A50F411 -S31508002E4000306062052084F82000012071E0207EB1 -S31508002E50012806D12068006850F0800021680860C3 -S31508002E6005E02068006830F0800021680860607E10 -S31508002E70012806D12068006850F0400021680860E3 -S31508002E8005E02068006830F0400021680860A07EF0 -S31508002E90012806D12068006850F0200021680860E3 -S31508002EA005E02068006830F0200021680860E07EB0 -S31508002EB0012806D12068006830F0100021680860F3 -S31508002EC005E02068006850F0100021680860207F3F -S31508002ED0012806D12068006850F0080021680860BB -S31508002EE005E02068006830F0080021680860607F07 -S31508002EF0012806D12068006850F00400216808609F -S31508002F0005E02068006830F0040021680860A168C0 -S31508002F10E068014320690143606901436068401E17 -S31508002F2001432068C16100206062012084F8200006 -S31508002F30002032BD30B4026890F820201300DBB2BE -S31508002F40012B03D0D2B2022A40F07F80594AD2F828 -S31508002F50000250F00100C2F80002D2F8000230F474 -S31508002F607C50C2F80002D2F800024B6A50EA0320ED -S31508002F70C2F8000201200B7D13F01F0310FA03F3B9 -S31508002F80D2F81C029843C2F81C02C869002816D158 -S31508002F90D2F80C029843C2F80C02486902EBC0004A -S31508002FA0CC684D68C5EA0444C0F84042486902EB5B -S31508002FB0C0008C680D68C5EA0444C0F84442C86974 -S31508002FC0012816D1D2F80C021843C2F80C02486937 -S31508002FD002EBC0000C684D68C5EA0444C0F84042DC -S31508002FE0486902EBC0008C68CD68C5EA0444C0F89D -S31508002FF044428869002805D1D2F804029843C2F8E9 -S31508003000040204E0D2F804021843C2F8040208696C -S31508003010002805D1D2F814029843C2F8140204E035 -S31508003020D2F814021843C2F81402086A012804D117 -S31508003030D2F81C020343C2F81C32D2F80002400838 -S315080030404000C2F80002002004E0416A51F48021E1 -S315080030504162012030BC704738B5040094F820005E -S31508003060012821D1022084F8200020680068400841 -S31508003070400021680860FEF71DF8050020684068D2 -S31508003080C0070DD5FEF716F8401B0B28F6D3606A65 -S3150800309050F400306062052084F82000012008E022 -S315080030A000206062002004E0606A50F4002060623C -S315080030B0012032BD0064004070B490F820500468C6 -S315080030C0A6688C68002CFFD02C00E4B2012C02D034 -S315080030D0EDB2022D6ED116F0E05F65D0C6F301643D -S315080030E0032C05D3416A51F400014162012066E0D0 -S315080030F00125A5401D608B68002B09D10B68CD689A -S3150800310055EA4355036826013344C3F880510AE05B -S315080031104B688D6855EAC305CB681D4303682601CD -S315080031203344C3F880510B69056826013544C5F850 -S315080031308431097D01290BD1016823011944D1F88D -S31508003140841151F48071036825012B44C3F8841156 -S31508003150D17993791B0453EA0163517953EA012320 -S3150800316011790B43016825012944C1F88C31D178BE -S3150800317093781B0453EA0163517853EA01231178C3 -S315080031800B43016822011144C1F888310168220104 -S315080031901144D1F8801151F0010100682201104450 -S315080031A0C0F8801100200AE0416A51F4001141621A -S315080031B0012004E0416A51F480214162012070BC7B -S315080031C0704710B40200002092F820301C00E4B2C8 -S315080031D0012C02D0DBB2022B07D11268926812EAE0 -S315080031E08162B2EB816F00D0012010BC704730B409 -S315080031F090F820402500EDB2012D03D0E4B2022C50 -S3150800320040F0988000290AD10468E46814F0030F96 -S3150800321010D1416A51F40011416201208FE004681F -S31508003220246914F0030F05D1416A51F40011416273 -S31508003230012084E004680D012C44D4F8B04114F050 -S31508003240040494609468002C07D104680D012C448A -S31508003250D4F8B041640D146006E004680D012C44EE -S31508003260D4F8B041E408546004680D012C44D4F83D -S31508003270B041C4F34004D46004680D012C44D4F86A -S31508003280B44114F00F04146104680D012C44D4F8F9 -S31508003290B441C4F30724946104680D012C44D4F89E -S315080032A0B441240C546102680C012244D2F8B821B6 -S315080032B01A7002680C012244D2F8B821120A5A7010 -S315080032C002680C012244D2F8B821120C9A700268DE -S315080032D00C012244D2F8B821120EDA7002680C01E9 -S315080032E02244D2F8BC211A7102680C012244D2F891 -S315080032F0BC21120A5A7102680C012244D2F8BC2178 -S31508003300120C9A7102680C012244D2F8BC21120EE2 -S31508003310DA71002906D10168C96851F020010068F0 -S31508003320C16005E00168096951F020010068016182 -S31508003330002004E0416A51F480214162012030BC3A -S3150800334070477047DFF8D804016851F00101016041 -S315080033507047DFF8CC040068400810F00100704799 -S31508003360DFF8BC140A6832F0F80252EAC0020A60B2 -S315080033707047DFF8B0040068400810F00100704795 -S31508003380DFF8A804006810F00C007047DFF89C040A -S31508003390006810F0F0007047DFF89004006810F439 -S315080033A0E0507047DFF88404006810F46040704706 -S315080033B00100DFF87C040068084050EA01407047C5 -S315080033C00100DFF86C040068084050EA01407047C5 -S315080033D0DFF84C040068400E10F001007047DFF873 -S315080033E05404006810F480007047DFF84804006849 -S315080033F0C0F388107047DFF83C04006810F44030CA -S315080034007047DFF83004006810F03F007047DFF8B7 -S3150800341010040068C00E10F001007047DFF80004C1 -S315080034200068400F10F00100704710B55FF0FF34D8 -S31508003430FFF788FFFFF78DFF0128FBD10020DFF893 -S31508003440EC130860DFF8F8030440DFF8D4030460DF -S315080034501020FFF785FFFFF7BBFF0028FBD1FFF71A -S31508003460D6FF0028FBD1FFF7D9FF0028FBD1DFF8EC -S31508003470D403DFF8C0130860DFF8CC03DFF8B8130D -S315080034800860DFF8B8130860DFF8C003016831F494 -S31508003490FE410160016851F47F010160DFF888038D -S315080034A00168490849000160016851F080710160AE -S315080034B0002010BD10B5040000F05CF920602068FB -S315080034C000F06CF96060606800F073F9A0606068ED -S315080034D000F079F9E06010BD10B50024032824D166 -S315080034E0FFF766FFDFF86813401A04D0401E06D0BF -S315080034F0401E0BD011E000F03DF904008DE0FFF707 -S3150800350028FF002801D0DFF84C4386E0FFF731FF9B -S31508003510002801D04FF400447FE000F02BF900F0BA -S315080035203DF900F050F9040077E00C2824D1FFF7A4 -S315080035303FFFDFF82413401A04D0001F06D0001FEF -S315080035400BD011E000F016F9040066E0FFF701FF62 -S31508003550002801D0DFF8FC425FE0FFF70AFF0028E9 -S3150800356001D04FF4004458E000F004F900F016F9D1 -S3150800357000F01FF9040050E0B0F5406F27D1FFF7BF -S3150800358017FFDFF8D812884207D0DFF8D41288422E -S3150800359007D0B0F10C2F0BD011E000F0EBF80400C7 -S315080035A03BE0FFF7D6FE002801D0DFF8A84234E05A -S315080035B0FFF7DFFE002801D04FF400442DE000F0AD -S315080035C0D9F800F0EBF800F0FEF8040025E0302802 -S315080035D023D1FFF7EDFEDFF88C12401A04D010381D -S315080035E006D010380BD011E000F0C4F8040014E03F -S315080035F0FFF7AFFE002801D0DFF858420DE0FFF7CD -S31508003600B8FE002801D04FF4004406E000F0B2F8F6 -S3150800361000F0C4F800F0CDF80400200010BD10B585 -S315080036200024C02824D1FFF7CBFEDFF83C12401A4D -S3150800363004D0403806D040380BD011E000F09AF894 -S31508003640040095E0FFF785FE002801D0DFF8044264 -S315080036508EE0FFF78EFE002801D04FF4004487E085 -S3150800366000F088F800F09AF800F0A3F804007FE06C -S31508003670B0F5407F27D1FFF7A3FEDFF8F0118842A7 -S3150800368007D0DFF8EC11884207D0B0F1032F0BD032 -S3150800369011E000F06FF804006AE0FFF75AFE002810 -S315080036A001D0DFF8B04163E0FFF763FE002801D0E0 -S315080036B04FF400445CE000F05DF800F06FF800F0AD -S315080036C078F8040054E0B0F5405F27D1FFF778FE9C -S315080036D0DFF8A011884207D0DFF89C11884207D08E -S315080036E0B0F1302F0BD011E000F044F804003FE0B1 -S315080036F0FFF72FFE002801D0DFF8584138E0FFF722 -S3150800370038FE002801D04FF4004431E000F032F8CA -S3150800371000F044F800F04DF8040029E0B0F5404FF9 -S3150800372026D1FFF74DFEDFF85411884207D0DFF89F -S315080037305011884207D0B0F1C02F0BD011E000F02D -S3150800374019F8040014E0FFF704FE002801D0DFF89A -S3150800375004410DE0FFF70DFE002801D04FF40044A8 -S3150800376006E000F007F800F019F800F022F8040067 -S31508003770200010BD80B50020FFF702FE002804D007 -S31508003780042804D0082804D006E0324805E03D485D -S3150800379003E000F022F800E02E4802BD10B5040050 -S315080037A0FFF7F4FD3849C0F30310085CC440200055 -S315080037B010BD10B50400FFF7EFFD3449800A085C18 -S315080037C0C440200010BD10B50400FFF7EBFD2F49DB -S315080037D0400B085CC440200010BD70B500200020D6 -S315080037E0FFF7FDFD002803D0B0F5800F02D003E0F7 -S315080037F0184C02E0234C00E0164CFFF702FE0500C9 -S31508003800FFF7F3FD0600B4FBF5F006FB00F6FFF73D -S31508003810F2FD000C401C4000B6FBF0F070BD000045 -S3150800382000380240703802407438024008380240B6 -S3150800383090380240043802408438024088380240F2 -S31508003840FFFFF2EA10300024003000240C38024052 -S31508003850010003000024F40004000C000004000C1E -S315080038600008000C100030004000C00000010003F2 -S31508003870000200030010003000200030004000C0A5 -S31508003880008000C000127A00585D0008945D0008A8 -S3150800389038B500F02BF9DFF808544021681C00F011 -S315080038A03CF92870DFF8FC434021601C00F035F92C -S315080038B020702878FF2802D02078FF2804D1842198 -S315080038C0DFF8E403FEF759FEDFF8E0430022DFF8ED -S315080038D0E0132000FEF790FCDFF8D8132000FEF76F -S315080038E0B7FC0120FEF771FE2000FEF7BBFCD4F8FA -S315080038F09802FDF77FFF00F010FAB0F5FA6F03D2D1 -S315080039004FF4FA6000F006FA31BD10B5DFF89C43B3 -S31508003910D4F89802FDF781FF2000FEF785FC002009 -S31508003920FEF753FE10BD70B505000C002000C0B2AE -S31508003930402804DBB921DFF87003FEF71EFE2000DD -S31508003940C0B200F069F8C0B2012804D0BD21DFF882 -S315080039505803FEF712FE00260EE0FFF7FBF93000CB -S3150800396080B2285C00F058F8C0B2012803D0C621FE -S31508003970CD48FEF702FE761C30002100C9B280B29F -S3150800398089B28842E9D370BD2DE9F04105000E00E1 -S31508003990C648D0F89802FDF7B3FCC74C2078002833 -S315080039A013D1C64D280000F02FF801280AD128782F -S315080039B0002807D02878402804DA01202070002043 -S315080039C0BF4908700020BDE8F081BD4FDFF8EC82E2 -S315080039D038784044401C00F017F80128F2D13878AE -S315080039E0401C3870387898F800108842EAD13A783E -S315080039F092B218F10101280000F0C8F900202070E1 -S31508003A00387830700120DEE780B50100A5480078D7 -S31508003A1000F0E8F8C0B202BD80B50100C9B2A048FE -S31508003A20007800F091F8C0B202BD7CB59C4C2078B5 -S31508003A3000F022F905002800C0B2002827D0280087 -S31508003A40C0B2412800DB4025002612E069462078EE -S31508003A5000F0C8F8C0B2012804D04FF4A371924808 -S31508003A60FEF78BFD9DF8000096493200D2B28854C5 -S31508003A70761C30002900C0B2C9B28842E6D3EDB23E -S31508003A802B009BB28F4A81218848FEF777FB73BDCE -S31508003A90F8B50600002000F004FA0400834D310052 -S31508003AA0C9B22800FEF786FB070000260FE03000A3 -S31508003AB080B2215C7B48007800F046F8C0B2012845 -S31508003AC004D04FF4B4717848FEF757FD761C3000E1 -S31508003AD0390080B289B28842E9D300F0E2F90200DF -S31508003AE0402301212800FEF757FBF1BD10B4764BA1 -S31508003AF0190013F11802002004E088744A6118318D -S31508003B001832401C0400E4B2002CF6D08874002059 -S31508003B1048616E48036010BC704710B46B4B1A6856 -S31508003B20002A01D1FF200DE01A6854691C6011743F -S31508003B309060D060002353741060C9B20844401ED8 -S31508003B405060907C10BC704738B505000C00280002 -S31508003B50C0B2022804DB4FF4E0715348FEF70DFDAE -S31508003B60182059492A00D2B242430A44527C2B00F3 -S31508003B70DBB243430B441B7C9A4201D1002030E060 -S31508003B802A00D2B242430A44D26814702A00D2B23A -S31508003B9042430A442B00DBB243430B445B7C5B1C69 -S31508003BA053742A00D2B242430A442B00DBB2434381 -S31508003BB00B44DB685B1CD3602A00D2B242430A443A -S31508003BC052682B00DBB243430B44DB689A4207D2A8 -S31508003BD02A00D2B242430A44EDB245434859D0605E -S31508003BE0012032BD38B504000D002000C0B20228FD -S31508003BF004DB4FF4F1712C48FEF7BFFC1821324A5A -S31508003C002000C0B248431044407C002801D100205F -S31508003C1031E02000C0B2484310448068007828701C -S31508003C202000C0B2484310442300DBB24B43134480 -S31508003C305B7C5B1E43742000C0B2484310442300DB -S31508003C40DBB24B4313449B685B1C83602000C0B205 -S31508003C504843104440682300DBB24B4313449B6837 -S31508003C60984207D22000C0B248431044E4B24C43FD -S31508003C7011598160012032BD10B504002000C0B280 -S31508003C80022804DB40F202210748FEF776FC0E49BB -S31508003C90E4B21820444301EB0400407C10BD000048 -S31508003CA0F80D00203C0E0020E05B0008C40400204C -S31508003CB06C0000201400002017100020C00E002001 -S31508003CC016100020000F0020800F0020081000208A -S31508003CD080B501201749087000F022F800F001F8B5 -S31508003CE001BD10B500F078F9012812D0114C2078E2 -S31508003CF001280ED1FDF7CDF90F490A680F49096861 -S31508003D008A1812F5FA72904203D30020207000F048 -S31508003D101BF810BD084908607047074800687047D7 -S31508003D2080B504480078012803D1FDF7B2F90349A4 -S31508003D30086001BD12100020F80F0020F40F0020C3 -S31508003D4080B500F053F901BD10B500F05FF9002801 -S31508003D5016D0FEF720FC002812D000F0EBF8FDF78D -S31508003D608BF900F070F900F055F906490840064944 -S31508003D70086000F04FF9001D046800F039F9A04703 -S31508003D8010BD000080FFFF1F08ED00E070B50400BD -S31508003D900D00160005E0287820706D1C641CFEF7DF -S31508003DA0D9FF3000461E80B20028F4D170BD00004D -S31508003DB038B5040000254023022281212000FEF7A1 -S31508003DC07DF94023022201212000FEF777F94023DE -S31508003DD0354A01212000FEF7DFF92800C0B232BDBE -S31508003DE038B50400002581212000FEF779F9012164 -S31508003DF02000FEF775F92800C0B232BD38B50B00B1 -S31508003E0017222A4C14F109011D7815F0600F29D1E3 -S31508003E105D78062D04D00A2D14D00B2D17D021E07D -S31508003E205D88ADB22D0AADB2212D07D114F112016C -S31508003E30DA88182A01DB172200E0DA8892B2FEF740 -S31508003E404BFF0FE001221A49FEF746FF0AE05988A0 -S31508003E50C9B2002903D198781549086002E019000B -S31508003E60FEF7FEFE002032BD80B5FFF7DEFD00201E -S31508003E7002BD80B50800C0B2FFF70AFE002002BDE9 -S31508003E8080B590F87402032801D1FFF7CEFD002013 -S31508003E9002BD20210180054870470A210180054896 -S31508003EA07047014870470000400F00204C00002072 -S31508003EB00C1000200800002010B500F0E9F800F00A -S31508003EC035FB434C0120207000F015FC00202070C3 -S31508003ED0FFF7DEFC0220207010BD1CB53D4C69467C -S31508003EE0200000F0BBFB012807D1012038490870E3 -S31508003EF09DF80010200000F0EBF86946200000F05D -S31508003F0036FC012807D10020314908709DF80010B9 -S31508003F10200000F0DDF869462000FFF735FD01288E -S31508003F2007D102202A4908709DF80010200000F0E9 -S31508003F30CFF813BD80B5FFF7E8FC01BD70B50400E6 -S31508003F400D00234E3078012804D12900C9B220007B -S31508003F5000F055FB3078002804D12900C9B22000AA -S31508003F6000F0E4FB3078022804D12900C9B2200009 -S31508003F70FFF7D9FC00F0A6F870BD154800780028B0 -S31508003F8005D0022807D004D3032806D007E040202E -S31508003F9006E0082004E03F2002E0002000E0402080 -S31508003FA080B270470A480078002805D0022807D052 -S31508003FB004D3032806D007E0402006E0082004E0E2 -S31508003FC03F2002E0002000E0402080B27047000059 -S31508003FD0BC000020800E002010B5002400F069F80F -S31508003FE0002800D001242000C0B210BD72B6704768 -S31508003FF062B6704780B500F037FC01BD80B500F0A9 -S315080040003CFC02BD80B500F06DFC02BD80B500F039 -S31508004010C7FC02BD80B500F004FD02BD80B500F006 -S315080040208AFC002801D1002001E000F0E1FC02BD75 -S3150800403080B5032000F065FE002000F089FE00F040 -S31508004040BBFF002002BD80B50C485FF0FF31016060 -S31508004050002202600A4801600022026009480160E5 -S3150800406000220260084801600022026007480160D9 -S315080040700021016001F012F8002002BD203802403C -S3150800408024380240103802401438024018380240DA -S31508004090DFF8C8030021017000218164002180F83F -S315080040A043100021A0F844100021817000214170BE -S315080040B07047DFF8A8030078002801D1002000E047 -S315080040C0012070470020DFF8941381F843007047F9 -S315080040D010B50178FF2917D100F08CF8DFF87C437A -S315080040E094F84300012802D1102000F07BF8B4F9B7 -S315080040F04400012807DB012084F84300B4F9441082 -S31508004100E01C00F053F810BDDFF8501309780129B8 -S315080041104BD10178C92932D0CC293FD0CF293AD002 -S31508004120D0292FD0D12933D0D2292ED0F32917D090 -S31508004130F4290FD0F5290AD0F6290ED0FA2912D07B -S31508004140FC2913D0FD2914D0FE2915D029E000F04A -S31508004150B5F8C3E700F0D1F8C0E700F0A6F8BDE768 -S3150800416000F0ECF8BAE700F08EF8B7E700F086F84A -S31508004170B4E700F072F8B1E700F063F8AEE700F0D4 -S3150800418004F9ABE700F020F9A8E700F0E9F8A5E79D -S3150800419000F048F9A2E700F057F99FE700F062F946 -S315080041A09CE7202000F01EF898E7ACE780B589B2B6 -S315080041B0FFF7C4FE01BDF8B504000D001600002780 -S315080041C004E02078C719641CFEF7C4FD2800451EC4 -S315080041D00028F6D1FFB237600120F2BD00209F49C2 -S315080041E0487070479D49FE22CA7008710220A1F8DE -S315080041F04400704710B5FFF7F1FF984C0120207076 -S31508004200FF20E07000202071207950F01000207106 -S315080042100020607160796071FFF7AFFEA071FFF74B -S31508004220C1FEE071FFF7BEFE80B2000A20720120CF -S3150800423060720120A0720820A4F84400FFF7DAFE95 -S3150800424010BD10B5854C00202070FFF7C7FFFF2072 -S31508004250E0700120A4F8440010BD8048FF21C17019 -S315080042600021017141784171002181710021C171DC -S31508004270002101720621A0F84410704780B500207D -S31508004280FFF7B0FF01BD7548FF21C170744981640D -S315080042900021017100214171002181710721C0F8B7 -S315080042A007100821A0F8441070476C49FF22CA700D -S315080042B0406888640120A1F84400704738B50400B6 -S315080042C0FFF75BFE80B2401E6178884203DA22203F -S315080042D0FFF788FF10E06278604D281D92B2A96C3E -S315080042E0FFF754FDFF20E870A86C61784018A864B1 -S315080042F06078401CA5F8440031BD38B50400FFF7C6 -S315080043003CFE80B2401E6178884203DA2220FFF71D -S3150800431069FF12E0514D6068A8646278281D92B260 -S31508004320A96CFFF733FDFF20E870A86C6178401888 -S31508004330A8646078401CA5F8440031BD10B5474C08 -S31508004340FF21E170E21D4168A06CFFF734FF207180 -S31508004350002060710020A0710820A4F8440010BD58 -S3150800436010B53E4CFF20E0700020207100206071DF -S31508004370FFF703FEA0710020E071002020720020E4 -S3150800438060720720A4F8440010BD38B50400FFF792 -S31508004390F4FD0100314D621C89B2491EA86CFFF775 -S315080043A02DFE002803D13120FFF71CFF0BE0FF206C -S315080043B0E870FFF7E2FDA96C80B2401E4018A864B9 -S315080043C00120A5F8440031BD38B50400FFF7D5FD36 -S315080043D080B2801E6178884203DA2220FFF702FF46 -S315080043E01FE01E4DFF20E8700120A5F84400607804 -S315080043F0002807D1FFF712FE002802D13120FFF767 -S31508004400F1FE0EE0A21C6178A86CFFF7F7FD002804 -S3150800441003D13120FFF7E6FE03E0A86C6178401867 -S31508004420A86431BD10B50D4C4168A06CFFF7EAFDD4 -S31508004430002803D13120FFF7D5FE04E0FF20E07005 -S315080044400120A4F8440010BD80B5FFF77DFC0348A1 -S31508004450FF21C1700121A0F8441001BD680D00209C -S31508004460A45D000880B53120FFF7BCFE01BD000041 -S31508004470F8B584B004000D0016001F006846FFF763 -S3150800448019F802984FF47A71B0FBF1F1002200E0B6 -S31508004490521C1000C0B2122845D2864B200080B2AA -S315080044A094465FFA8CFC13F81CC096465FFA8EFE9B -S315080044B003EB4E0E9EF801E01EEB0C0C1CF1010CF2 -S315080044C00CFB00F0B1FBF0FC00FB1C100028DFD150 -S315080044D0200080B294465FFA8CFC13F81CC09646FE -S315080044E05FFA8EFE03EB4E0E9EF801E01EEB0C0CF7 -S315080044F01CF1010C0CFB00F0B1FBF0F028802888B9 -S315080045000028C5D0288840F2014C6045C0DA100062 -S31508004510C0B213F810003070D2B203EB42004078F4 -S315080045203870012000E0002005B0F0BD30B58BB032 -S315080045300020ADF8020000208DF8010000208DF85B -S31508004540000040F267656B460DF101020DF10201AC -S315080045504FF4FA70FFF78CFF002803D1B5215648AF -S31508004560FEF70BF8554C56482060002020760020B0 -S3150800457060760020A0760120E076002020770020D3 -S3150800458060770020A0600020E0609DF80100401ED2 -S31508004590000420619DF80000401E00056061BDF81A -S315080045A0020060602000FEF70FFC002D02D46D05A6 -S315080045B0444805E025F00045ED0055F0040542485D -S315080045C00021069100210791012108912900090C73 -S315080045D00191ADB202950100090C039180B20490D5 -S315080045E000200590012009900E200A9001A92000BC -S315080045F0FEF7A0FC2000FEF72FFD0BB030BD30B54E -S3150800460087B0020040F2E170002803D40190002030 -S31508004610039004E020F0004002900420039000205C -S315080046200490C9B20591254D6B4601A92800FEF7ED -S3150800463043FDC0B200280FD1FCF72BFD040032342D -S3150800464000992800FEF7BDFD002805D0FEF782FB7D -S31508004650FCF71FFD8442F3D207B030BD78B587B0AA -S3150800466003000C0040F2676600256A4600211348DD -S31508004670FEF7BDFD002812D1002E07D40098B042DF -S315080046800DD1029800280AD1012508E026F0004637 -S315080046900198B04203D10298042800D101252800C8 -S315080046A0C0B2012801D1049820702800C0B208B011 -S315080046B070BD00007C5C0008A45B0008B00F0020F9 -S315080046C0006400400400E0FFFCFF1F00016851F091 -S315080046D0010101607047C069400910F00100704788 -S315080046E0C069C00910F001007047406AC0B270473F -S315080046F0C9B28162704718B587B04FF4614000901F -S315080047000020019000200290002003900C200490C5 -S3150800471000200590002006904D4C6946200000F0C8 -S315080047203CFD2000FFF7D2FF08B010BD70B50400AD -S315080047300D002800C0B2412803DB81214548FDF75A -S315080047401CFF2800C0B200F06BF8002607E0FEF751 -S3150800475001FB300080B2205C00F062F8761C300065 -S315080047602900C9B280B289B28842F0D370BD2DE95A -S31508004770F04105000E00384C2078002815D1374D39 -S31508004780280000F03DF8012837D12878002834D0D1 -S315080047902878412831DAFCF77CFC3149086000208A -S315080047A0304908700120207027E02E4FDFF8AC80D2 -S315080047B038784044401C00F023F8012814D1387892 -S315080047C0401C3870387898F80010884215D13A7825 -S315080047D092B218F101012800FFF7D8FA00202070DC -S315080047E038783070012009E0FCF753FC1C49096849 -S315080047F06431814201D2002020700020BDE8F0819A -S3150800480038B50400124D2800FFF765FF002805D0CB -S315080048102800FFF76AFF2070012000E0002032BD63 -S3150800482038B501000A4DC9B22800FFF761FFFCF749 -S3150800483030FC04000A342800FFF752FF002805D18F -S31508004840FEF788FAFCF725FC8442F4D231BD000055 -S3150800485000480040645B000815100020B40D0020D5 -S3150800486000100020141000205FF0FF30DFF8D4138A -S315080048700860DFF8D41308607047F8B504000D0027 -S315080048801600DFF8C873B96CF86C4118491E091B85 -S31508004890681E814201D2002023E0200000F0A9F919 -S315080048A0FF2805D02819401E00F0A3F9FF2801D1DA -S315080048B0002016E02100490A4FF400704143386889 -S315080048C0814207D12B0032002100DFF87C0300F07B -S315080048D0DCF806E02B0032002100DFF8680300F060 -S315080048E0D4F8F2BD70B504000D00DFF86003816CE2 -S315080048F0C06C4118491E091B681E814201D200205E -S3150800490018E0200000F075F906002C19641E200036 -S3150800491000F06FF93100C9B2FF2903D00100C9B20E -S31508004920FF2901D1002005E00100C9B23000C0B25C -S3150800493000F01EF970BD80B500200090C2490868D5 -S3150800494010F1010F01D1012029E0009A4868821868 -S315080049500092009A886882180092009AC86882189D -S315080049600092009A086982180092009A486982188B -S315080049700092009A886982180092009AC86982187B -S3150800498000920098C04300900098401C00906A4628 -S315080049900421AE48006810F5E470FFF76EFF02BD0B -S315080049A00021AA4A1068006841181068001D0068AE -S315080049B04118106808300068411810680C30006803 -S315080049C041181068103000684118106814300068E3 -S315080049D041181068183000684118106810F5E4701E -S315080049E000684118002901D1012000E00020704725 -S315080049F080B59548016811F1010F05D000F08FF8D0 -S31508004A00002801D100200BE08E48016811F1010F42 -S31508004A1005D000F084F8002801D1002000E001202C -S31508004A2002BD8A480068704780B5CA0501D00020D3 -S31508004A300BE002688A4201D1012006E001604FF4CA -S31508004A400072001DFFF7A2F9012002BD38B5040067 -S31508004A500D007D48844208D17A4C29002000FFF7D2 -S31508004A60E3FF00280FD100200EE078490A68954236 -S31508004A7002D104000D68F0E7200000F050F8002885 -S31508004A80EBD1002000E0200032BD2DE9F041040002 -S31508004A90884616001D0047467F0A4FF400704743B4 -S31508004AA0206810F1010F07D139002000FFF7BCFF7D -S31508004AB0002801D100202EE02068B84208D039002D -S31508004AC02000FFF7C3FF0400002C01D1002022E0DC -S31508004AD02068B8EB000804EB080010F10408FEF79C -S31508004AE039F9201DB8EB0000B0F5007F09D317F59A -S31508004AF000712000FFF7AAFF0400002C0DD014F166 -S31508004B000408307888F8000018F10108761C6D1E34 -S31508004B10002DE4D10120BDE8F0810020FBE72DE956 -S31508004B20F0410500012600F001FC002704E0D8F852 -S31508004B300000A04215D17F1C802F13D2D5F8008023 -S31508004B4018EB870805EB87004468FEF703F922008F -S31508004B5000234146022000F0A3FB0028E7D00026E8 -S31508004B6000E0002600F0F2FB3000C0B2BDE8F0819C -S31508004B7078B585B004000D000126002000902800B5 -S31508004B802100C0B2C9B2884200D200262F482100AF -S31508004B90027AC9B2914205D390F850002900C9B2E9 -S31508004BA0884200D200263000C0B201281DD100205C -S31508004BB00190022004900120039000F0B7FB00E06A -S31508004BC0641C28002100C0B2C9B288420BD3FEF784 -S31508004BD0C1F82000C0B20290694601A800F064FC42 -S31508004BE00028EDD0002600F0B1FB3000C0B206B0B8 -S31508004BF070BD70B50400FF25002600E0761C300065 -S31508004C00C0B207281AD2FEF7A5F80C210F4A3000C1 -S31508004C10C0B2484310588442F0D33000C0B248436B -S31508004C2013583000C0B2484310444068C3189C4229 -S31508004C30E4D2F6B24E4302EB0600057A2800C0B26B -S31508004C4070BD00006007002064090020BC5A0008F7 -S31508004C5010F00700374B1A684FF6FF010A4036492D -S31508004C6051EA00210A431A60704732480068C0F3C7 -S31508004C7002207047020052B2002A04D409012F4AC2 -S31508004C8040B2115407E009012D4A40B210F00F0056 -S31508004C90104400F8041C704710B410F00700D0F157 -S31508004CA00703052B01D3042301E0D0F10703041DF4 -S31508004CB0072C01D2002000E0C01E012414FA03F3D9 -S31508004CC05B1E1940814014FA00F0401E104008434C -S31508004CD010BC704780B5411EB1F1807F01D3012019 -S31508004CE00EE0401E174908600F215FF0FF30FFF7FE -S31508004CF0C1FF0020144908600720144908600020F5 -S31508004D0002BD80B5FFF7A4FF01BD70B504000D0014 -S31508004D1016000020FFF7A9FF32002900FFF7BCFFA5 -S31508004D200100200040B2FFF7A5FF70BD80B5FFF770 -S31508004D30D1FF02BD0CED00E00000FA0500E400E03A -S31508004D4018ED00E014E000E018E000E010E000E0F4 -S31508004D5010B504004FF47A700D490978B0FBF1F0EC -S31508004D600C490968B1FBF0F0FFF7E0FF002801D015 -S31508004D7001200CE0102C09D2002221005FF0FF3040 -S31508004D80FFF7C3FF04480460002000E0012010BDBF -S31508004D90BD0000200400002000000020D94801685A -S31508004DA051F4803101607047D6490A6832F44042AE -S31508004DB0104308607047D448016851F480210160A7 -S31508004DC07047D148016851F4803101607047CE4878 -S31508004DD00068400C10F001007047CC490A68920838 -S31508004DE09200104308607047C848006810F00C002D -S31508004DF07047C6490A6832F0F002104308607047E7 -S31508004E00C2490A6832F4E052104308607047BF4945 -S31508004E100A6832F46042104308607047BA4801686D -S31508004E2051F0807101607047B7480068400E10F075 -S31508004E300100704770B4B64D2E68B64C2640304314 -S31508004E40084350EA82101843286070BC704770B453 -S31508004E50AF4D2E68B04C26403043084350EA8210C6 -S31508004E601843286070BC704781B0AC490A68024391 -S31508004E700A60096808400090009801B07047A74981 -S31508004E800A6832EA00000860704781B0A4490A68D7 -S31508004E9002430A60096808400090009801B070470C -S31508004EA09F490A6832EA00000860704781B09D4948 -S31508004EB00A6802430A60096808400090009801B031 -S31508004EC0704798490A6832EA00000860704781B05E -S31508004ED095490A6802430A600968084000900098E4 -S31508004EE001B0704790490A6832EA000008607047C6 -S31508004EF08E490A68120912011043086070478B48E8 -S31508004F00006810F00F00704709048161704780B58A -S31508004F1000F005F800F05CFB00F068FBFCE780B5E4 -S31508004F20FFF786F800F001F801BD80B50720FFF706 -S31508004F30DFFFFFF7E4FF072803D067217C48FDF76A -S31508004F401CFB4FF44040FFF72FFFFFF727FFFFF743 -S31508004F5032FFFFF736FFFFF73AFF0128FBD10023A0 -S31508004F604FF4D87208215FF48000FFF763FF5FF003 -S31508004F7010634FF4D87208215FF48000FFF767FFCB -S31508004F80FFF74CFFFFF750FF0128FBD10020FFF782 -S31508004F9030FF4FF4A050FFF733FF4FF40040FFF700 -S31508004FA036FF0220FFF719FFFFF71EFF0828FBD17F -S31508004FB0604800F025FB01BD38B586B04FF4804047 -S31508004FC0FFF785FF5FF08050FFF770FF0120FFF7BE -S31508004FD04BFF0220FFF748FF0420FFF745FF082094 -S31508004FE0FFF742FF5FF48020FFF760FF5FF0007075 -S31508004FF0FFF75CFF802000900120019000200290BE -S3150800500000200390002004904B4C6946200000F0D5 -S3150800501011FC80212000FFF777FF4FF40050009025 -S3150800502000200190002004906946444800F002FCE4 -S315080050304FF440750095022001900320029000204D -S315080050400390002004900720059069463C4800F02C -S31508005050F1FB0095022001900320029000200390A6 -S3150800506000200490092005906946200000F0E2FB24 -S315080050704FF4C050009002200190032002900020B7 -S315080050800390002004900A20059069462D4800F0F8 -S31508005090D1FB8020FFF7F9FE07B030BD10B5FEF74B -S315080050A0C4F9254C80212000FFF72EFF244800F084 -S315080050B02FFB224800F02CFB200000F029FB21489A -S315080050C000F026FB8020FFF7EBFE5FF00070FFF78D -S315080050D0F8FE5FF48020FFF7F4FE0820FFF7CFFE06 -S315080050E00420FFF7CCFE0220FFF7C9FE0120FFF7D8 -S315080050F0C6FE5FF08050FFF7E4FE4FF48040FFF7EE -S31508005100F1FE10BD00700040003802400838024029 -S31508005110043802400080BCFF0080BFF030380240EF -S31508005120343802404038024044380240003C0240CD -S31508005130105B000800E6DF0C00040240000802408D -S31508005140000C024000000240006810F001007047A1 -S31508005150426832F44052114341607047826832F423 -S315080051604072114381607047B2F5004F0ED11A00A4 -S31508005170520812EB4102B2FBF3F189B24FF6F07214 -S315080051800A40C1F342010A43C26005E011EB53012C -S31508005190B1FBF3F189B2C1607047F8B505000F009D -S315080051A0012600242800FFF7CFFF002862D12968CE -S315080051B03A48014078680143F86801433869014371 -S315080051C0B86901432960B9682800FFF7C1FF796902 -S315080051D02800FFF7C3FF2948854204D10320FEF7BC -S315080051E07BF904003AE02648854204D10C20FEF7F4 -S315080051F073F9040032E02348854204D13020FEF7D3 -S315080052006BF904002AE02048854204D1C020FEF745 -S3150800521006FA040022E01D48854205D14FF4407085 -S31508005220FEF7FDF9040019E01948854205D14FF447 -S315080052304060FEF751F9040010E01648854205D192 -S315080052404FF44050FEF7EBF9040007E01248854298 -S3150800525004D14FF44040FEF7E2F90400002C09D0CF -S315080052603868002806D000263B68BA69210028005D -S31508005270FFF77AFF3000C0B2F2BD0000001001400F -S315080052800044004000480040004C004000500040E8 -S315080052900014014000780040007C0040F369FFEFED -S315080052A02DE9F84381460E0014001D000120DFF8A1 -S315080052B0E071387D012801D1022035E001203875DA -S315080052C04CF25038404600F048F80100C9B20029AF -S315080052D027D1300022002B00B9F1000F07D0B9F111 -S315080052E0020F0ED008D3B9F1030F0ED010E011004B -S315080052F0C9B200F091F80BE0110089B200F07BF812 -S3150800530006E0110000F066F802E000F04EF8FFE74C -S31508005310404600F022F8DFF87C110A68520852006D -S315080053200A6000213975C0B2BDE8F28300205949E8 -S315080053300A68002A08D5594A594B1360594B136015 -S315080053400968002900D50120C0B270475148016894 -S3150800535051F0004101600020704738B50400002074 -S3150800536000204B498861FBF7A5FE05004A480168FD -S31508005370C9030BD514F1010FF8D0002C04D0FBF7A4 -S3150800538099FE401B8442F1D203200DE0016811F01A -S31508005390F20F03D000F04FF8012005E00168C907B5 -S315080053A001D501210160002032BD10B439490C68CD -S315080053B034F440740C600C6854F440740C600C6847 -S315080053C054F001040C600260001D0360BFF34F8FA8 -S315080053D010BC70472F4A136833F440731360136880 -S315080053E053F400731360136853F0010313600160EC -S315080053F0BFF34F8F7047274A136833F4407313601F -S31508005400136853F480731360136853F00103136031 -S315080054100180BFF34F8F70471E4A136833F44073F9 -S31508005420136013681360136853F001031360017067 -S31508005430BFF34F8F704718480168890704D5144988 -S315080054408A6952F020028A610168C90604D51049A2 -S315080054508A6952F010028A610168890604D50C49E6 -S315080054608A6952F008028A610168490604D5084922 -S315080054708A6952F004028A610168090604D504495A -S315080054808A6952F002028A61F221016070470000BF -S31508005490D80F0020103C02400C3C0240043C02405D -S315080054A023016745AB89EFCD2DE9F04104000D00D6 -S315080054B001200020DFF81061307D012801D102208B -S315080054C03EE0012030754CF250373800FFF745FFB3 -S315080054D00100C9B2002930D15FF0FF312960216887 -S315080054E001290DD1E068C0B200F02CF83800FFF7AA -S315080054F034FFDFF8D8100A6832F004020A601CE0AC -S31508005500D4F8048001E018F10108A26861688A18D5 -S31508005510904512D2E168C9B2404600F026F8380034 -S31508005520FFF71BFF29490A6832F07A020A60010070 -S31508005530C9B20029E7D0C5F8008000213175C0B28C -S31508005540BDE8F08121490A6832F440720A600A68A7 -S3150800555052F004020A600A68C0B2000250F48030B1 -S3150800556010430860BFF34F8F704700220A00D2B27B -S31508005570002A01D100210EE00A00D2B2012A02D186 -S315080055804FF4807107E0C9B2022902D14FF40071C5 -S3150800559001E04FF440710D4A136833F44073136009 -S315080055A0136819431160116831F0F8011160116828 -S315080055B0C00050F0020008431060106850F48030B4 -S315080055C01060BFF34F8F7047D80F0020103C024081 -S315080055D080B5FEF7B5FBFDF7B9FBFBF73DFDFEF71A -S315080055E009FDFEF769FCFEF773FB01BD80B5FDF703 -S315080055F0B1FBFBF745FDFEF770FCFEF772FB01BD3C -S3150800560001490860704700000400002030B40468AF -S3150800561091FAA1F3B3FA83F30325DBB25B009D404D -S31508005620AC4391FAA1F1B1FA81F1C9B249008A40B5 -S315080056302243026030BC704743688B435143194389 -S315080056404160704730B4846891FAA1F3B3FA83F3E2 -S315080056500325DBB25B009D40AC4391FAA1F1B1FA98 -S3150800566081F1C9B249008A402243826030BC704742 -S3150800567030B4C46891FAA1F3B3FA83F30325DBB215 -S315080056805B009D40AC4391FAA1F1B1FA81F1C9B230 -S3150800569049008A402243C26030BC704730B4046A6D -S315080056A091FAA1F3B3FA83F30F25DBB29B009D4071 -S315080056B0AC4391FAA1F1B1FA81F1C9B289008A40E5 -S315080056C02243026230BC704730B4446A0B001B0A9E -S315080056D093FAA3F3B3FA83F30F25DBB29B009D403D -S315080056E0AC43090A91FAA1F1B1FA81F1C9B289006C -S315080056F08A402243426230BC704742490A681043D6 -S31508005700086070473F490A6832EA00000860704737 -S3150800571010B500243C49884206D10120FFF7EDFF69 -S315080057200120FFF7EFFF6AE03849884206D10220D8 -S31508005730FFF7E3FF0220FFF7E5FF60E03449884200 -S3150800574006D10420FFF7D9FF0420FFF7DBFF56E058 -S315080057503049884206D10820FFF7CFFF0820FFF717 -S31508005760D1FF4CE02C49884206D11020FFF7C5FF2F -S315080057701020FFF7C7FF42E02849884206D12020BB -S31508005780FFF7BBFF2020FFF7BDFF38E0244988421A -S3150800579006D14020FFF7B1FF4020FFF7B3FF2EE008 -S315080057A02049884206D18020FFF7A7FF8020FFF70F -S315080057B0A9FF24E01C49884208D14FF48070FFF7FE -S315080057C09CFF4FF48070FFF79DFF18E01749884249 -S315080057D008D14FF40070FFF790FF4FF40070FFF701 -S315080057E091FF0CE01249884208D14FF48060FFF718 -S315080057F084FF4FF48060FFF785FF00E00124200056 -S31508005800C0B210BD10380240000002400004024039 -S3150800581000080240000C024000100240001402403A -S3150800582000180240001C02400020024000240240EA -S3150800583000280240F8B505000E0000200020306858 -S3150800584090FAA0F0B0FA80F72FE0726921002800DC -S31508005850FFF73AFF28E034680120B8400440002CDE -S3150800586022D0726821002800FFF7D0FE7068012850 -S3150800587002D07068022804D1B26821002800FFF718 -S31508005880E1FE326921002800FFF7F2FE706802285F -S315080058900AD194FAA4F0B0FA80F00828D5D2726931 -S315080058A021002800FFF7FAFE7F1C3068F840002820 -S315080058B0D1D17068012802D07068022804D1F26834 -S315080058C031682800FFF7B8FE0020F2BD12200880D4 -S315080058D02D487047042008802C48704780B50A0078 -S315080058E0C0B2002804D12A492A48FDF7C4F903E0C2 -S315080058F027492848FDF7BFF9254802BD10B50A0013 -S31508005900234C21002448FDF7B6F9200010BD80B5C8 -S315080059101A20088000F022F8204802BD80B50A0047 -S31508005920C0B2002804D11A491D48FDF7A4F903E0BE -S3150800593017491B48FDF79FF9154802BD80B50A00AF -S31508005940C0B2002804D112491648FDF794F903E0BD -S315080059500F491448FDF78FF90D4802BD38B51248AE -S31508005960006812490C6812490968081800280AD004 -S315080059700A4D0822A91C00F01DF8042215F112018F -S31508005980200000F017F831BD880000209C00002098 -S31508005990680B0020445D0008685D0008A000002030 -S315080059A09C5D00082C5D000820F4F01F24F4F01F0D -S315080059B028F4F01F30B4002300231AE00400240F53 -S315080059C037341D00EDB201F815400AE00400240F33 -S315080059D00A2CF3D20400240F30341D00EDB201F86E -S315080059E01540000100241D00EDB201EB45056C7061 -S315080059F05B1C1C001500E4B2EDB2AC42E6D330BC29 -S31508005A00704700000F48016851F4700101600E49A3 -S31508005A10086850F00100086000200C4A10600A6807 -S31508005A200B4802400A600B480B4A1060086830F4BD -S31508005A30802008600020094908605FF00060084976 -S31508005A400860704788ED00E00038024008380240D8 -S31508005A50FFFFF6FE10300024043802400C380240DE -S31508005A6008ED00E0433A5C576F726B5C736F6674BF -S31508005A70776172655C4F70656E424C545C54617216 -S31508005A806765745C44656D6F5C41524D434D375F85 -S31508005A9053544D333246375F4E75636C656F5F46B8 -S31508005AA03734365A475F4941525C426F6F745C75AA -S31508005AB07362645F636F6E662E6300000080000881 -S31508005AC000800000010000000000010800800000BE -S31508005AD002000000008001080080000003000000AA -S31508005AE0000002080000020004000000000004088C -S31508005AF0000004000500000000000808000004007B -S31508005B000600000000000C08000004000700000062 -S31508005B10433A5C576F726B5C736F66747761726534 -S31508005B205C4F70656E424C545C5461726765745C78 -S31508005B3044656D6F5C41524D434D375F53544D3349 -S31508005B403246375F4E75636C656F5F463734365A33 -S31508005B50475F4941525C426F6F745C6D61696E2E96 -S31508005B6063000000433A5C576F726B5C736F667430 -S31508005B70776172655C4F70656E424C545C54617215 -S31508005B806765745C536F757263655C41524D434D2E -S31508005B90375F53544D333246375C72733233322E85 -S31508005BA063000000433A5C576F726B5C736F6674F0 -S31508005BB0776172655C4F70656E424C545C546172D5 -S31508005BC06765745C536F757263655C41524D434DEE -S31508005BD0375F53544D333246375C63616E2E63002C -S31508005BE0433A5C576F726B5C736F66747761726564 -S31508005BF05C4F70656E424C545C5461726765745CA8 -S31508005C00536F757263655C41524D434D375F53540C -S31508005C104D333246375C7573622E630030B50168C2 -S31508005C2084684218416802EB5103C90703D54C44FE -S31508005C3001E0491C05D19A420AD012F9011B12F853 -S31508005C40015B002904F8015BF3D4491EF7D5F2E796 -S31508005C500C3030BD10B5074979441831064C7C44E0 -S31508005C60163404E00A68081D114488470146A14213 -S31508005C70F8D110BD500000006C00000005020602B5 -S31508005C80060307030803090309040A040B040C04A2 -S31508005C900C050D050E050F050F0610061007100852 -S31508005CA04EF68851CEF20001086840F4700008608C -S31508005CB0BFF34F8FBFF36F8F4FF00070E1EE100AFE -S31508005CC070470000FBB3FFFF5C0F0000C000002018 -S31508005CD00000000049FFFFFF7802000030010000C5 -S31508005CE00000002000F00DF8002801D0FFF7B2FFF1 -S31508005CF0AFF300800020AFF30080FFF708F900F04B -S31508005D0002F80120704700F001B80000074638463F -S31508005D1000F002F8FBE7000080B5AFF30080024A06 -S31508005D2011001820ABBEFBE72600020057696E5526 -S31508005D3053422042756C6B20496E746572666163C6 -S31508005D406500000057696E5553422042756C6B20FA -S31508005D5044657669636500000000000000000000E5 -S31508005D6001020304060708094F70656E424C542069 -S31508005D7055736572000000000148804701480047D6 -S31508005D80055A0008895D0008AFF30080FFF788FF11 -S31508005D90FFF7A8FF000000000102030444656661DE -S31508005DA0756C74004F70656E424C5400FFF7FEBF69 -S31508005DB0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF09 -S31508005DC0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF9 -S31508005DD0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE9 -S31508005DE0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD9 -S31508005DF0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC9 -S31508005E00FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB8 -S31508005E10FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA8 -S31508005E20FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF98 -S31508005E30FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF88 -S31508005E40FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF78 -S31508005E50FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF68 -S31508005E60FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF58 -S31508005E70FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF48 -S31508005E80FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF38 -S31508005E90FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF28 -S31508005EA0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF18 -S31508005EB0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF08 -S31508005EC0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF8 -S31508005ED0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE8 -S31508005EE0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD8 -S31508005EF0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC8 -S31508005F00FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB7 -S31508005F10FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA7 -S31508005F20FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF97 -S31508005F30FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF87 +S315080003700411401C0F28F7D30F98002814D116F53E +S315080003800060406850F0020016F500614860A06BF6 +S3150800039030F40010A063206850F040002060206808 +S315080003A050F08000206003E0A06B50F40010A063BA +S315080003B0002016F56061086016F50060006816F5FD +S315080003C0006108600A9801280CD10798002804D112 +S315080003D00021200000F0E5F818E00121200000F0D7 +S315080003E0E0F813E00A9803280CD10798002804D1EE +S315080003F00021200000F0D5F808E00121200000F0D7 +S31508000400D0F803E00321200000F0CBF810212000EB +S3150800041000F0A7F8002800D00125200000F0B2F867 +S31508000420002800D00125002016F50061086100208B +S3150800043016F500614861002016F50061C8610020C4 +S315080004401BE0002116EB401212F51062116006E05F +S315080004505FF0904116EB401212F51062116016EB30 +S31508000460401111F5106100220A6116EB401111F5D1 +S3150800047010614FF67F328A60401C0599884210D277 +S3150800048016EB401111F5106109680029D9D5002825 +S31508000490DED15FF0006116EB401212F510621160B2 +S315080004A0DDE700201BE0002116EB401212F5306252 +S315080004B0116006E05FF0904116EB401212F53062CB +S315080004C0116016EB401111F5306100220A6116EB36 +S315080004D0401111F530614FF67F328A60401C05994C +S315080004E0884210D216EB401111F5306109680029CF +S315080004F0D9D50028DED15FF0006116EB401212F55F +S3150800050030621160DDE716F50060006930F480702E +S3150800051016F5006630610020A0617FF080406061BA +S315080005200898002803D1A06950F01000A061A169BD +S31508000530DFF8980B0143A1610B98002803D0A06946 +S3150800054050F00800A0610F98012805D1A06940F075 +S31508000550804050F00400A0612800C0B272BC5DF86B +S3150800056010FB0022890151F020010161521CDFF8BD +S31508000570601B8A4204D201698906F7D400207047B5 +S315080005800320FCE7002110220261491CDFF8402BFA +S31508000590914204D20269D206F7D40020704703209C +S315080005A0FCE710F500621268C9B2114310F5006045 +S315080005B001600020704710F50060806810F00600A2 +S315080005C0002801D1002006E0022801D0062801D122 +S315080005D0022000E00F20C0B2704730B40A784B788A +S315080005E0012B2BD110F50063DB6901240D7815F07A +S315080005F00F05AC40A4B2234310F50064E36110EB89 +S31508000600421313F510631B681B0440D410EB421306 +S3150800061013F510631B688C686405640DC97854EA81 +S31508000620814454EA825444F0805454F400442343E9 +S3150800063010EB421010F51060036028E010F5006317 +S31508000640DB6901240D7815F00F05AC4053EA044325 +S3150800065010F50064E36110EB421313F530631B6871 +S315080006601B0414D410EB421313F530631B688C6813 +S315080006706405640DC97854EA814444F0805454F4FE +S315080006800044234310EB421010F53060036000204D +S3150800069030BC704730B40A784B78012B47D110EB41 +S315080006A0421313F510631B68002B17D510EB421382 +S315080006B013F510631B6853F0006310EB421414F52E +S315080006C01064236010EB421313F510631B6853F094 +S315080006D0804310EB421414F510642360012310F5CF +S315080006E00064E46B0D7815F00F0513FA05F5ADB245 +S315080006F0AC4310F50065EC6310F50064E46909780D +S3150800070011F00F018B409BB234EA030310F5006128 +S31508000710CB6110EB421111F510610B68DFF8B419C3 +S315080007200B4010EB421010F51060036045E010EB2B +S31508000730421313F530631B68002B17D510EB4213D1 +S3150800074013F530631B6853F0006310EB421414F57D +S315080007503064236010EB421313F530631B6853F0C3 +S31508000760804310EB421414F530642360012310F51E +S315080007700064E46B0D7815F00F0513FA05F534EAF5 +S31508000780054410F50065EC6310F50064E469097822 +S3150800079011F00F018B4034EA034410F50061CC6177 +S315080007A010EB421111F530610B68DFF82C190B407C +S315080007B010EB421010F530600360002030BC704723 +S315080007C0F8B504000D784B78012B40F005814B698C +S315080007D0002B24D114EB451313F5106314EB4516BF +S315080007E016F5106636696FF3DC461E6114EB451381 +S315080007F013F5106314EB451616F51066366956F4AC +S3150800080000261E6114EB451313F5106314EB451609 +S3150800081016F510663669F60CF6041E615AE014EBF6 +S31508000820451313F5106314EB451616F5106636696D +S31508000830F60CF6041E6114EB451313F5106314EB5E +S31508000840451616F5106636696FF3DC461E6114EB1D +S31508000850451616F5106614EB451313F510631F6954 +S31508000860D1F814C08B6813EB0C0CBCF1010C8B6827 +S31508000870BCFBF3F3DFF864C81CEAC34C5CEA070761 +S31508000880376114EB451313F5106314EB451616F58B +S31508000890106636694F697F037F0B3E431E61CB782E +S315080008A0012B17D114EB451313F5106314EB4516FA +S315080008B016F51066366936F0C0461E6114EB451308 +S315080008C013F5106314EB451616F51066366956F0DF +S315080008D000561E611300DBB2012B36D108690028C9 +S315080008E005D014EB451010F510600A694261C87806 +S315080008F001281DD114F500608068C0050CD414EBDE +S31508000900451010F51060006850F0005014EB4511C2 +S3150800091011F5106108600BE014EB451010F5106036 +S31508000920006850F0805014EB451111F5106108600D +S3150800093014EB451010F51060006850F0044014EBF5 +S31508000940451414F510642060DFE014EB451313F525 +S3150800095010631B6853F0044314EB451616F510662E +S315080009603360CB78012B10D04869002800F0CD8081 +S3150800097014F50060406B0122097811F00F018A40D6 +S31508000980104314F500646063BFE014F500639B68C8 +S31508000990DB050CD414EB451313F510631B6853F0F1 +S315080009A0005314EB451414F5106423600BE014EBA4 +S315080009B0451313F510631B6853F0805314EB451465 +S315080009C014F510642360D2B200924B699BB20A7880 +S315080009D0C96800F0B1F998E014EB451010F53060DD +S315080009E014EB451313F530631B69DB0CDB04036159 +S315080009F014EB451010F5306014EB451313F530630E +S31508000A001B696FF3DC430361486900281AD114EBAC +S31508000A10451010F5306014EB451313F530631B6968 +S31508000A208E687603760B3343036114EB451010F595 +S31508000A30306014EB451313F530631B6953F4002338 +S31508000A40036129E04B698868C3185B1E8868B3FB95 +S31508000A50F0F014EB451313F5306314EB451616F551 +S31508000A60306636690700BFB2DFF870C61CEAC74CA5 +S31508000A705CEA06061E6114EB451313F5306314EBA6 +S31508000A80451616F5306636698F6880B200FB07F0A2 +S31508000A904003400B30431861D2B2012A08D1C86816 +S31508000AA0002805D014EB451010F53060CA6842617D +S31508000AB0C87801281DD114F500608068C0050CD4DB +S31508000AC014EB451010F53060006850F0005014EB38 +S31508000AD0451111F5306108600BE014EB451010F56F +S31508000AE03060006850F0805014EB451111F5306104 +S31508000AF0086014EB451010F53060006850F00440AB +S31508000B0014EB451414F5306420600020F2BD000093 +S31508000B10BFFFBDFFC0ACD80000350C00C0E1E40043 +S31508000B2040420F000024F400804F12008073060133 +S31508000B3020D61300A0491A0160E31600002D3101E2 +S31508000B4040771B0040A44C01C091210000366E017D +S31508000B502075380020ABA601E09C410070B40B005C +S31508000B601C785978012940F095805969002924D1C3 +S31508000B7010EB441111F5106110EB441515F51065CD +S31508000B802D696FF3DC450D6110EB441111F5106109 +S31508000B9010EB441515F510652D6955F400250D6102 +S31508000BA010EB441111F5106110EB441515F510659D +S31508000BB02D69ED0CED040D6137E010EB441111F5CC +S31508000BC0106110EB441515F510652D69ED0CED0453 +S31508000BD00D6110EB441111F5106110EB441515F574 +S31508000BE010652D696FF3DC450D6199685D69A94249 +S31508000BF001D29968596110EB441111F5106110EB97 +S31508000C00441515F510652D6955F400250D6110EB91 +S31508000C10441111F5106110EB441515F510652D6991 +S31508000C205E697603760B35430D61D2B2012A15D17A +S31508000C301969002905D010EB441111F510611A69DC +S31508000C404A6110EB441111F51061096851F004412D +S31508000C5010EB441010F5106001606AE010EB4411C7 +S31508000C6011F51061096851F0044110EB441212F5B0 +S31508000C7010621160596900295BD010F50061496B53 +S31508000C8001221B7813F00F039A40114310F50060F8 +S31508000C9041634EE010EB441111F5306110EB441539 +S31508000CA015F530652D69ED0CED040D6110EB441159 +S31508000CB011F5306110EB441515F530652D696FF3A4 +S31508000CC0DC450D615969002901D09968596110EB15 +S31508000CD0441111F5306110EB441515F530652D6991 +S31508000CE055F400250D6110EB441111F5306110EB38 +S31508000CF0441515F530652D699E687603760B3543E0 +S31508000D000D61D2B2012A08D1D968002905D010EBA5 +S31508000D10441111F53061DA684A6110EB441111F596 +S31508000D203061096851F0044110EB441010F5306049 +S31508000D300160002070BC7047F0B4049CE4B2002C3B +S31508000D4013D19BB2DB1C9B0800250CE00C0026681F +S31508000D501700FFB24FF4805404FB070717F58057B6 +S31508000D603E60091D6D1C9D42F0D30020F0BC704703 +S31508000D7030B492B2D21C9208002306E010F58054D3 +S31508000D8024680D002C60091D5B1C9342F6D30800ED +S31508000D9030BC7047020008784978012921D112EB46 +S31508000DA0401111F51061096800290DD400280BD0EF +S31508000DB012EB401111F51061096831F0804112EB10 +S31508000DC0401313F51063196012EB401111F5106109 +S31508000DD0096851F4001112EB401212F51062116005 +S31508000DE020E012EB401111F53061096800290DD495 +S31508000DF000280BD012EB401111F53061096831F06B +S31508000E00804112EB401313F53063196012EB401161 +S31508000E1011F53061096851F4001112EB401212F510 +S31508000E20306211600020704710B40A784B78012BA5 +S31508000E301ED110EB421313F510631B6833F400132D +S31508000E4010EB421414F510642360CB78032B02D000 +S31508000E50C97802292AD110EB421111F510610968E7 +S31508000E6051F0805110EB421010F5106001601DE042 +S31508000E7010EB421313F530631B6833F4001310EBC1 +S31508000E80421414F530642360CB78032B02D0C9785A +S31508000E9002290BD110EB421111F53061096851F0A6 +S31508000EA0805110EB421010F530600160002010BC34 +S31508000EB0704710B50400200000210CE04FF67F3281 +S31508000EC010EB411313F510639A6010EB411313F5F9 +S31508000ED030639A60491C0F29F0D3002110F500628F +S31508000EE01161002110F500625161002110F50060C2 +S31508000EF0C1612000FFF746FB0100C9B2002901D0F5 +S31508000F00C0B20AE010212000FFF72BFB0100C9B28E +S31508000F10002901D0C0B200E0C0B210BD10F50062D1 +S31508000F20126832F4FE6210F500631A6010F500626A +S31508000F301268C9B2090111F4FE61114310F5006087 +S31508000F4001600020704780B510F50061496831F0EE +S31508000F50020110F500604160032000F0C3F800208C +S31508000F6002BD80B510F50061496851F0020110F51F +S31508000F7000604160032000F0B5F8002002BD0100C2 +S31508000F804869896908407047010011F50060806961 +S31508000F9011F50061C9690840000C7047010011F598 +S31508000FA00060806911F50061C969084080B2704720 +S31508000FB00200C9B212EB411010F53060806812F5D4 +S31508000FC0006251690840704710B410F50062126952 +S31508000FD010F500635B6B11F00F04E340DB0113F0BF +S31508000FE080031A43C9B210EB411010F510608068EF +S31508000FF0104010BC7047406910F00100704710F5AA +S3150800100010610968C90AC90210F51062116010F565 +S315080010100061496851F4807110F500604160002054 +S31508001020704710B40300006CDFF8B440A04206D342 +S3150800103013F530600068002801D500202AE000205A +S3150800104013F53064206113F53060006950F4002010 +S3150800105013F53064206113F53060006950F018000C +S3150800106013F53064206113F53060006950F0C04014 +S3150800107013F530642061C9B201290AD113F530602D +S31508001080426113F53060006850F0802013F5306334 +S315080010901860002010BC70470021491C0C4A914278 +S315080010A00FD20369002BF8D50021036953F0010319 +S315080010B00361491C914206D20369DB07F9D4002073 +S315080010C070470320FCE70320FAE7000000383C805D +S315080010D0410D0300007833EC0078F3EF0000F81FA9 +S315080010E00B30544F38B5040000F03EF8050014F1F3 +S315080010F0010F02D004480078241800F035F8401B88 +S31508001100A042FAD331BD00BFBD00002080B500F073 +S315080011100DF810481049086000201049086005209D +S315080011200F49086000200F49086001BD00200C49DE +S31508001130086070470A480068C00303D50948016873 +S31508001140491C0160704780B5FFF7F4FF0548006841 +S3150800115002BD0000BF4B030014E000E018E000E009 +S3150800116010E000E03810002080B5FFF7ECFF02BD64 +S31508001170704730B4002513E050F8042BD30744BF5A +S31508001180A9F101039A18091F042942F8045BFAD247 +S3150800119013468C0744BF15809B1CC90748BF1D70A2 +S315080011A050F8041B0029E7D130BC704738B58AB01F +S315080011B00400002C01D10120B6E0256894F8BD038F +S315080011C0002805D1002084F8BC03200000F054FE56 +S315080011D0032084F8BD03E86BC00501D40020206114 +S315080011E02068FFF798F8211D83B06846342200F07E +S315080011F045FE0EBC2068FEF7E7FF002804D0022053 +S3150800120084F8BD0301208FE000212068FFF789F8E4 +S31508001210002130E01C200A00D2B2424322440123B6 +S3150800122082F83D300A00D2B24243224482F83C108A +S315080012300A00D2B2424322440B00DBB2A2F8423083 +S315080012400A00D2B242432244002382F83F300A0001 +S31508001250D2B242432244002353640A00D2B2424324 +S315080012602244002393640A00D2B200FB02F0204411 +S3150800127000220265491C0800C0B262689042C9D3C0 +S3150800128000212BE01C200A00D2B24243224400234C +S3150800129082F8FD310A00D2B24243224482F8FC1198 +S315080012A00A00D2B242432244002382F8FF310A00E0 +S315080012B0D2B2424322440023C2F804320A00D2B210 +S315080012C0424322440023C2F808320A00D2B200FB85 +S315080012D002F020440022C0F81022491C0800C0B2BF +S315080012E062689042CED3211D83B06846342200F04E +S315080012F0C5FD0EBC2068FFF730F8002804D0022090 +S3150800130084F8BD0301200FE0002084F8380001208E +S3150800131084F8BD03606A012802D1200000F027FE88 +S315080013202068FFF71EFE00200BB030BD10B5040084 +S31508001330002C01D101200CE0032084F8BD03200015 +S3150800134000F01EF8200000F026FE002084F8BD03F9 +S31508001350002010BD10B5040094F8BC03012801D183 +S3150800136002200CE0012084F8BC032068FFF7EBFD9F +S315080013702068FEF7CAFF002084F8BC03002010BDD1 +S3150800138010B5040094F8BC03012801D1022016E028 +S31508001390012084F8BC032068FEF7BDFF2068FFF72C +S315080013A088FD002804D0002084F8BC03012006E04C +S315080013B02068FFF7D6FD002084F8BC03002010BD86 +S315080013C02DE9F041060035682F003068FFF713FE57 +S315080013D0002840F077823068FFF7D1FD002800F03A +S315080013E071823068FFF7CBFD800705D53068406904 +S315080013F010F00200316848613068FFF7C0FDC0068A +S315080014003FD53068806930F0100031688861D5F8BA +S31508001410208018F00F011C20414306EB010010F54F +S31508001420FE74C8F34340022816D147F6F07018EA4E +S31508001430000F20D0C8F30A1292B2E1682800FFF71D +S3150800144097FCE068C8F30A110844E060A169C8F38C +S315080014500A104118A1610EE0C8F3434006280AD1D4 +S31508001460082216F571712800FFF782FCA169C8F3F6 +S315080014700A104118A1613068806950F0100031687F +S3150800148088613068FFF77BFD000347D50025306883 +S31508001490FFF77AFD04003FE0E0073BD52900C9B213 +S315080014A03068FFF785FD80465FEAC87009D517EBF7 +S315080014B0451010F53060012181602900300000F0E8 +S315080014C00CFC5FEA087009D517EB451010F530607B +S315080014D0082181602900300000F0A2FC5FEAC8609C +S315080014E005D517EB451010F53060102181605FEACD +S315080014F0886005D517EB451010F53060202181600E +S315080015005FEA884006D517EB451010F530604FF4B2 +S31508001510005181606D1C6408002CBDD13068FFF74E +S315080015202EFD400376D53068FFF738FD0400002508 +S315080015306EE0E0076AD52900C9B23068FFF744FDB6 +S3150800154080465FEAC87036D5012115F00F0011FAFA +S3150800155000F017F50061496B31EA000017F50061E4 +S31508001560486317EB451010F510600121816030695A +S3150800157001281BD11C2000FB05F13144896C00FBB6 +S3150800158005F23244526C114400FB05F23244916470 +S31508001590002D0BD100FB05F03044006D002805D165 +S315080015A016F5717201213068FFF73BFD2900C9B2B3 +S315080015B0300000F008FD5FEA087005D517EB451006 +S315080015C010F51060082181605FEAC86005D517EB41 +S315080015D0451010F51060102181605FEA486005D556 +S315080015E017EB451010F51060402181605FEA88709E +S315080015F005D517EB451010F51060022181605FEAEA +S31508001600086003D52900300000F0F3FA6D1C640861 +S31508001610002C8ED13068FFF7B2FC00281CD517F5D0 +S31508001620006040684008400017F50061486096F879 +S31508001630F403012807D1002086F8F40300213000BE +S3150800164000F0A8FC02E0300000F008FD30684069B0 +S3150800165010F00040316848613068FFF790FC0005DB +S315080016600DD517F500608068C00702D5300000F078 +S31508001670DAFC3068406910F4006031684861306807 +S31508001680FFF77DFC00011AD53068406910F000604C +S315080016903168486196F8F40300280DD1012086F8D0 +S315080016A0F4033068406DC0F38300C6F8F8030121DF +S315080016B0300000F06FFC02E0300000F0B4FC306847 +S315080016C0FFF75DFCC00440F1938017F500604068A1 +S315080016D04008400017F50061486010213068FEF7A1 +S315080016E040FF00203CE04FF67F3117EB401212F521 +S315080016F01062916017EB401212F51062126832F40C +S31508001700001217EB401313F510631A6017EB40121B +S3150800171012F51062126852F0006217EB401313F5C7 +S3150800172010631A6017EB401212F53062916017EBDE +S31508001730401111F53061096831F4001117EB4012B8 +S3150800174012F53062116017EB401111F53061096826 +S3150800175051F0006117EB401212F530621160401C1F +S3150800176071688842BFD317F50060C06950F0011050 +S3150800177017F50061C861306B002812D017F50060B4 +S31508001780D0F8840050F00B0017F50061C1F884000A +S3150800179017F50060406C50F00B0017F500614864BF +S315080017A011E017F50060406940F4005050F02B0036 +S315080017B017F50061486117F50060006950F00B00E5 +S315080017C017F50061086117F50060006830F4FE60DF +S315080017D017F50067386016F571723169C9B2306855 +S315080017E0FFF71FFC3068406910F480503168486183 +S315080017F03068FFF7C4FB800417D53068FFF7FFFB96 +S315080018003068FEF7D8FEF06000F04CFD0100F26883 +S31508001810D2B23068FEF710FD300000F0E8FB306801 +S31508001820406910F40050316848613068FFF7A7FB3B +S31508001830000708D5300000F0D4FB3068406910F086 +S315080018400800316848613068FFF799FBC0020AD57D +S315080018500021C9B2300000F011FC3068406910F46C +S315080018608010316848613068FFF789FB80020AD525 +S315080018700021C9B2300000F0FAFB3068406910F464 +S315080018800010316848613068FFF779FB400008D5D9 +S31508001890300000F0FAFB3068406910F0804031688B +S315080018A048613068FFF76BFB40070BD53068446822 +S315080018B0600702D5300000F0F2FB30684068044348 +S315080018C030684460BDE8F08110B5040094F8BC03A4 +S315080018D0012801D1022009E0012084F8BC03206810 +S315080018E0FFF731FB002084F8BC03002010BD10B5BB +S315080018F0040094F8BC03012801D1022009E0012064 +S3150800190084F8BC032068FFF72CFB002084F8BC038E +S31508001910002010BD10B5040094F8BC03012801D1BD +S3150800192002200CE0012084F8BC0384F83810C9B200 +S315080019302068FFF7F3FA002084F8BC03002010BDE6 +S3150800194070B5050000260800C0B200060CD50C00CC +S31508001950E4B214F00F041C20444305EB040010F114 +S315080019603C04012060700BE00C00E4B214F00F0494 +S315080019701C20444305EB040010F5FE74002060703B +S3150800198011F00F01217092B2A260E370607800280E +S3150800199001D02078E080DBB2022B01D10020207133 +S315080019A095F8BC03012801D102200BE0012085F837 +S315080019B0BC0321002868FEF710FE002085F8BC034A +S315080019C03000C0B270BD10B504000800C0B20006F1 +S315080019D00BD50A00D2B212F00F021C20424304EBC8 +S315080019E002003C30012242700BE00A00D2B212F02B +S315080019F00F021C20424304EB020010F5FE70002281 +S31508001A00427011F00F01017094F8BC13012901D13D +S31508001A1002200AE0012184F8BC1301002068FEF7C1 +S31508001A2039FE002084F8BC03002010BD38B51C0020 +S31508001A300D00EDB215F00F051C235D4300EB050301 +S31508001A4013F5FE73DA605C6100249C6100245C7007 +S31508001A5011F00F041C700469012C00D11A6111F0F1 +S31508001A600F0F06D10269D2B219000068FFF776F89F +S31508001A7005E00269D2B219000068FEF7A1FE00204F +S31508001A8032BDC9B211F00F011C2251430844D0F8E7 +S31508001A901402704738B51C000D00EDB215F00F059D +S31508001AA01C235D4300EB05033C33DA605C610024CC +S31508001AB09C6101245C7011F00F041C700469012CF0 +S31508001AC000D11A6111F00F0F06D10269D2B21900BE +S31508001AD00068FFF743F805E00269D2B2190000680A +S31508001AE0FEF76EFE002032BD38B504000D006068B2 +S31508001AF02900C9B211F00F01884201D2012039E04C +S31508001B002800C0B200060CD52900C9B211F00F0191 +S31508001B101C20414304EB010010F13C0101204870F0 +S31508001B2009E02900C9B21C20414304EB010010F565 +S31508001B30FE71002048700120887015F00F000870AB +S31508001B4094F8BC03012801D1022013E0012084F88F +S31508001B50BC032068FFF71EF915F00F0F06D114F520 +S31508001B6071722169C9B22068FFF75BFA002084F810 +S31508001B70BC03002032BD10B5040060680A00D2B26A +S31508001B8012F00F02904201D2012031E00800C0B2E3 +S31508001B9000060BD50A00D2B212F00F021C204243EF +S31508001BA004EB02003C30012242700BE00A00D2B27C +S31508001BB012F00F021C20424304EB020010F5FE70DF +S31508001BC0002242700022827011F00F01017094F811 +S31508001BD0BC13012901D102200AE0012184F8BC13B3 +S31508001BE001002068FFF720F9002084F8BC030020D4 +S31508001BF010BD2DE9FC4704000D00266837001C209F +S31508001C0000FB05F0204410F13C08D8F81400D8F879 +S31508001C101810884201D201205DE0D8F81400D8F8DF +S31508001C201890B0EB0909D8F80800484501D2D8F849 +S31508001C30089019F103095FEA990926E0D8F8140013 +S31508001C40D8F818A0B0EB0A0AD8F80800504501D20F +S31508001C50D8F808A01AF103095FEA99092069C0B201 +S31508001C60009053469BB22A00D2B2D8F80C10300026 +S31508001C70FFF762F8D8F80C005044C8F80C00D8F8FA +S31508001C8018001AEB000AC8F818A017EB451010F54B +S31508001C901060806980B2484509D3D8F81800D8F88A +S31508001CA01410884203D2D8F814000028C6D1D8F8F0 +S31508001CB01800D8F8141088420CD3012015F00F0527 +S31508001CC010FA05F517F50060406B30EA050517F5BB +S31508001CD000677D630020BDE8F68738B505000C006F +S31508001CE029680800096C10EB441212F530629268F4 +S31508001CF02B69012B62D113070ED55D4B9942C0F0B3 +S31508001D008D80110440F18A8010EB441010F5306084 +S31508001D104FF40041816081E0930606D510EB44102C +S31508001D2010F530602021816078E012F0280F75D117 +S31508001D304F4B994209D3110407D510EB441010F5FF +S31508001D4030604FF40041816068E01C2101FB04F219 +S31508001D502A44D2F8042210EB441010F530600069CA +S31508001D604003400B121A01FB04F02844C0F8142261 +S31508001D7001FB04F02844D0F8080201FB04F22A44C7 +S31508001D80D2F80422104401FB04F22A44C2F80802DD +S31508001D90002C0DD101FB04F105EB0100D0F810026F +S31508001DA0002805D115F5717201212868FFF739F960 +S31508001DB02100C9B2280000F0F7F82FE02D4B994210 +S31508001DC017D1110407D510EB441010F530604FF405 +S31508001DD00041816022E0910605D510EB441010F50C +S31508001DE03060202181602100C9B2280000F0DCF8AB +S31508001DF014E0002C0DD11C2000FB04F02844D0F878 +S31508001E001002002805D115F5717200212868FFF720 +S31508001E1008F92100C9B2280000F0C6F8002032BD32 +S31508001E2070B5040022681000156C10EB411212F50B +S31508001E30306292680E4EB54208D3120406D510EBEE +S31508001E40411010F530604FF400418160200000F029 +S31508001E50A3F8B54208D32069012805D114F5717293 +S31508001E6001212068FFF7DDF8002070BD00000000A2 +S31508001E700B30544F0A31544F70470000103A07D3BD +S31508001E8030B4B1E83810103AA0E83810F9D230BCAE +S31508001E90530724BFB1E80810A0E8081044BF51F85A +S31508001EA0043B40F8043BD20724BF31F8022B20F844 +S31508001EB0022B44BF0B7803707047121F17D35B00C1 +S31508001EC009D151F8043B20F8023B1B0C121F20F8DD +S31508001ED0023BF6D20BE051F8043B00F8013B1B0A23 +S31508001EE020F8023B1B0C121F00F8013BF3D238BF47 +S31508001EF0121D521E24BF11F8013B00F8013BF8D809 +S31508001F007047000070B403685B6A0C00E4B2002CEA +S31508001F1005D192B253EA0243006883621FE004685F +S31508001F20A46A13EB1443002409E005682600F6B2F8 +S31508001F3005EB8605D5F8045113EB1543641C2500FB +S31508001F40EDB20E00F6B2761EB542EED30068C9B2FF +S31508001F5000EB810092B253EA0243C0F80031002038 +S31508001F6070BC704789B200684162002070470168FA +S31508001F700122C0F8FC23002280F8F423886950F077 +S31508001F8000608861486D40F0805050F00300486555 +S31508001F90002070477047704780B510F57171D0F80A +S31508001FA0000400F0FEF901BD80B50B00DBB21C226F +S31508001FB0534300EB0302D2F80822C9B2D0F8000452 +S31508001FC000F021FA01BD80B50B00DBB21C22534399 +S31508001FD000EB0302926CC9B2D0F8000400F05EFA76 +S31508001FE001BD80B5D0F8000400F013FB01BD38B57B +S31508001FF004000125E068002801D1002508E0E06812 +S31508002000022801D1012503E09121464800F027FB6B +S315080020102900C9B2D4F8000400F0E5FAD4F800049F +S3150800202000F0B1FA31BD10B50400D4F8000400F090 +S31508002030DDFA206810F56060006850F0010021683C +S3150800204011F560610860206A002804D036480168E6 +S3150800205051F00601016000F02BFB10BD10B504001D +S3150800206000F027FBD4F8000400F0C9FA10BD80B5CB +S31508002070C9B2D0F8000400F0DEFA01BD80B5C9B2D5 +S31508002080D0F8000400F0D5FA01BD10B5040001200F +S3150800209000F00DFBD4F8000400F0CFFA10BD10B51F +S315080020A00400002000F003FBD4F8000400F0C7FA8F +S315080020B010BD10B50178002931D11C4CC4F80004B4 +S315080020C0C0F8C4425FF0A04020600620606002208D +S315080020D0E060002020610220A0610120E06100206C +S315080020E02062002060620020E06200202063200059 +S315080020F0FFF75CF8002804D040F22511094800F0E3 +S31508002100AEFA80212000FFF72DFF40220021200093 +S31508002110FFF7F8FE802201212000FFF7F3FE0020DA +S3150800212010BD0000D45B000810ED00E0C0000020E0 +S3150800213080B500210021D0F8C402FFF7F7F8C0B235 +S3150800214000F09BF8C0B202BD80B500210021D0F88E +S31508002150C402FFF7FFF8C0B200F08FF8C0B202BDA4 +S3150800216080B500210021D0F8C402FFF709F9C0B2F2 +S3150800217000F083F8C0B202BD10B51C00002300238E +S315080021801300DBB2220092B2C9B2D0F8C402FFF73C +S31508002190D7FBC0B200F071F8C0B210BD80B50022FE +S315080021A00022C9B2D0F8C402FFF70DFCC0B200F095 +S315080021B064F8C0B202BD80B500220022C9B2D0F8C8 +S315080021C0C402FFF791FCC0B200F057F8C0B202BDD6 +S315080021D080B500220022C9B2D0F8C402FFF7CBFCB2 +S315080021E0C0B200F04AF8C0B202BDD0F8C422080056 +S315080021F0C0B2000609D5C9B211F07F011C204143BF +S3150800220002EB010090F83E0008E0C9B211F07F0128 +S315080022101C20414302EB010090F8FE01704780B58F +S3150800222000220022C9B2D0F8C402FFF773FBC0B27D +S3150800223000F023F8C0B202BD10B500240024C9B2CC +S31508002240D0F8C402FFF726FCC0B200F016F8C0B2F8 +S3150800225010BD10B500240024C9B2D0F8C402FFF797 +S31508002260E5FBC0B200F009F8C0B210BD80B5C9B22E +S31508002270D0F8C402FFF705FC02BD0021C0B2002851 +S3150800228005D0022807D004D3032806D007E000208B +S3150800229006E0032004E0012002E0032000E003201A +S315080022A0C0B270470148006870470000040000206B +S315080022B080B5002801D1032018E0D0F8B832002BE9 +S315080022C002D00023C0F8B832D0F8CC32002B02D0A6 +S315080022D00023C0F8CC32002901D0C0F8B41201217D +S315080022E080F89C120270FFF7E4FEC0B202BD10B57A +S315080022F00400012084F89C02D4F8B802002806D00D +S315080023006168C9B22000D4F8B82252689047D4F858 +S31508002310CC02002802D00020C4F8CC022000FFF727 +S315080023201FFF0100C9B2002901D0C0B203E0200096 +S31508002330FFF7FEFEC0B210BD1CB504000020ADF8C4 +S315080023400000002901D1032009E0C4F8B812684644 +S31508002350D4F8B812C96A8847C4F8CC02002016BD5A +S3150800236080B5FFF7F1FE02BD0020704780B5032255 +S31508002370D0F8B832002B05D0C9B2D0F8B822126806 +S31508002380904702001000C0B202BD80B5D0F8B8224E +S31508002390002A04D0C9B2D0F8B82252689047002063 +S315080023A002BD10B5040004F2AA2000F035FD012094 +S315080023B0C4F89402B4F8B002C4F8980294F8AA02D1 +S315080023C010F01F00002803D002280DD006D311E014 +S315080023D004F2AA21200000F075F912E004F2AA21FD +S315080023E0200000F0AEF90CE004F2AA21200000F06B +S315080023F0E0F906E094F8AA1211F080012000FFF730 +S31508002400DAFEC0B210BD10B5040010000A00D2B240 +S31508002410002A2CD114F5AA72D4F89412032912D1E1 +S31508002420D1689368994210D29368D1685B1A936011 +S315080024309168D368994201D2926800E0D268010097 +S31508002440200000F052FD002010BDD4F8B802006943 +S31508002450002808D094F89C02032804D12000D4F858 +S31508002460B81209698847200000F047FDEBE7D4F861 +S31508002470B802806900280FD094F89C0203280BD173 +S31508002480C9B22000D4F8B822926990470100C9B2AF +S315080024900029D8D0C0B2D7E70320D5E710B5040085 +S315080024A010000A00D2B2002A56D114F11402D4F848 +S315080024B09412022944D1D168936899420FD293683D +S315080024C0D1685B1A936092680100200000F005FD50 +S315080024D00023002200212000FFF7BBFE30E0D06871 +S315080024E09168884217D15068D168884213D35068DA +S315080024F0D4F8981288420ED200220021200000F05B +S31508002500ECFC0020C4F898020023002200212000D9 +S31508002510FFF79FFE14E0D4F8B802C068002808D078 +S3150800252094F89C02032804D12000D4F8B812C9688C +S31508002530884780212000FFF73EFE200000F0E8FCD7 +S3150800254094F8A002012805D12000FFF70DFF00200E +S3150800255084F8A002002010BDD4F8B802406900280B +S315080025600FD094F89C0203280BD1C9B22000D4F8E6 +S31508002570B822526990470100C9B20029EAD0C0B210 +S31508002580E9E70320E7E710B50400012084F89C0278 +S315080025900020C4F89402002060600020C4F8A40259 +S315080025A0D4F8BC02002806D06168C9B22000D4F865 +S315080025B0B822526890474023002200212000FFF7E6 +S315080025C0DBFD0120A4F864014020C4F86001402323 +S315080025D0002280212000FFF7CFFD0120A0844020A3 +S315080025E02062002010BD01740020704790F89C12EC +S315080025F080F89D12042180F89C120020704790F8FC +S315080026009C12042903D190F89D1280F89C12002090 +S31508002610704780B590F89C12032908D1D0F8B812F3 +S31508002620C969002903D0D0F8B812C96988470020BB +S3150800263002BD00207047002070470020704780B513 +S31508002640012180F89C12D0F8B812002905D04168FB +S31508002650C9B2D0F8B82252689047002002BD80B5AA +S3150800266000F065FCFCE7000000690840884201D1DB +S31508002670012000E00020C0B2704780B54FF4005139 +S315080026800548FFF7F1FF002801D0002002E000F01E +S315080026907AFC012002BD00000008024080B56420D3 +S315080026A000F04FFC01BD80B500F04EFC01BD70473F +S315080026B07047704701000878491C097850EA0120DC +S315080026C080B2704710B500240A7812F06002002A1A +S315080026D009D0202A01D0402A2ED1D0F8B8229268F3 +S315080026E0904704002AE04A78002A19D0012A1DD00A +S315080026F0032A18D0052A09D0062A04D0082A0CD09D +S31508002700092A06D015E000F07EF914E000F07EFAFA +S3150800271011E000F0AAFA04000DE000F023FB0AE03D +S3150800272000F03FFB07E000F05BFB04E000F062FB13 +S3150800273001E000F089FB01E000F086FB2000C0B252 +S3150800274010BD70B505000E000024307810F060004A +S31508002750002803D0202801D0402823D195F89C02D0 +S31508002760401E022819D83079022811D231002800D3 +S31508002770D5F8B822926890470400F08800280BD153 +S315080027802000C0B2002807D1280000F0B6FB03E0FD +S315080027903100280000F058FB03E03100280000F063 +S315080027A053FB03E03100280000F04EFB2000C0B2C6 +S315080027B070BD70B505000E000024B188307810F0A1 +S315080027C0600000280CD0202802D0402840F0148150 +S315080027D031002800D5F8B8229268904704000FE126 +S315080027E07078002872D001283AD0032840F0FF807C +S315080027F095F89C02022802D0032816D02BE0080080 +S31508002800C0B200280CD00800C0B2802808D0C9B2CF +S315080028102800FFF7D0FC80212800FFF7CCFC03E056 +S315080028203100280000F010FB19E0708800280ED14E +S315080028300800C0B200280AD00800C0B2802806D016 +S31508002840F088002803D1C9B22800FFF7B4FC280095 +S3150800285000F053FB03E03100280000F0F5FACAE067 +S3150800286095F89C02022802D0032816D029E0080011 +S31508002870C0B200280CD00800C0B2802808D0C9B25F +S315080028802800FFF798FC80212800FFF794FC03E056 +S315080028903100280000F0D8FA17E0708800280FD118 +S315080028A011F07F0F03D0C9B22800FFF791FC28006A +S315080028B000F023FB31002800D5F8B822926890472B +S315080028C003E03100280000F0BFFA94E095F89C0276 +S315080028D0022802D003282BD084E00800C0B20028C2 +S315080028E008D00800C0B2802804D03100280000F0C3 +S315080028F0ABFA7BE00800C0B2000609D5C9B211F0F0 +S315080029007F011420414305EB010010F1140108E092 +S31508002910C9B211F07F011420414305EB010010F5FF +S31508002920AA71002008600222280000F0C9FA5DE0BA +S315080029300800C0B200060FD50A00D2B212F00F0284 +S315080029401420424305EB0200808C002815D1310083 +S31508002950280000F079FA49E00A00D2B212F00F0214 +S315080029601420424305EB0200B0F86401002804D1A4 +S315080029703100280000F068FA38E00800C0B2000606 +S315080029800AD50A00D2B212F07F021420424305EBA0 +S31508002990020010F1140609E00A00D2B212F07F0212 +S315080029A01420424305EB020010F5AA760800C0B2CF +S315080029B0002803D00800C0B2802802D10020306069 +S315080029C00AE0C9B22800FFF710FC002802D001204F +S315080029D0306001E00020306002223100280000F05B +S315080029E06FFA03E03100280000F02EFA03E0310008 +S315080029F0280000F029FA03E03100280000F024FA44 +S31508002A002000C0B270BDF8B505000E000020ADF874 +S31508002A10000000270024708880B2000AC0B201288E +S31508002A200AD0022810D0032823D0062800F0A58053 +S31508002A30072800F0B280C2E06946287CD5F8B4229F +S31508002A40126890470700BFE0287C002808D168462E +S31508002A50D5F8B812896A884707000220787007E017 +S31508002A606846D5F8B812C96A884707000220787000 +S31508002A70AAE0B078002808D002282CD018D3042859 +S31508002A804FD03BD305285FD071E0D5F8B402406833 +S31508002A90002807D06946287CD5F8B42252689047A2 +S31508002AA0070004E03100280000F0CEF9641C63E05A +S31508002AB0D5F8B4028068002807D06946287CD5F87E +S31508002AC0B42292689047070004E03100280000F01D +S31508002AD0BBF9641C50E0D5F8B402C068002807D0DA +S31508002AE06946287CD5F8B422D2689047070004E0E6 +S31508002AF03100280000F0A8F9641C3DE0D5F8B402BE +S31508002B000069002807D06946287CD5F8B4221269DE +S31508002B109047070004E03100280000F095F9641C8E +S31508002B202AE0D5F8B4024069002807D06946287C0F +S31508002B30D5F8B42252699047070004E0310028000E +S31508002B4000F082F9641C17E0D5F8B4028069002801 +S31508002B5007D06946287CD5F8B422926990470700C1 +S31508002B6004E03100280000F06FF9641C04E031002D +S31508002B70280000F069F9641C26E0287C002806D1A4 +S31508002B806846D5F8B812496B8847070004E0310053 +S31508002B90280000F059F9641C16E0287C002808D1A2 +S31508002BA06846D5F8B812096B884707000720787079 +S31508002BB004E03100280000F047F9641C04E0310005 +S31508002BC0280000F041F9641CE4B2002C1DD1F088FD +S31508002BD0002817D0BDF8000000280ED0BDF8000068 +S31508002BE0F188884202D3F088ADF80000BDF80020CD +S31508002BF03900280000F064F907E03100280000F0E9 +S31508002C0023F902E0280000F078F9F1BD38B505008F +S31508002C108888002825D1C888002822D14888802895 +S31508002C201FD28C7814F07F0495F89C02032803D1F0 +S31508002C30280000F009F917E085F89E422100C9B27C +S31508002C402800FFF7ECFA280000F057F9E4B2002C48 +S31508002C5003D0022085F89C0206E0012085F89C0234 +S31508002C6002E0280000F0F0F831BDF8B505000E00C6 +S31508002C7000243B4F708838703878022805D3310015 +S31508002C80280000F0E1F8032068E095F89C02022885 +S31508002C9002D003281ED056E03878002816D0387897 +S31508002CA0686039782800FFF761FB04002000C0B28D +S31508002CB0002804D03100280000F0C6F809E02800F2 +S31508002CC000F01BF9032085F89C0202E0280000F0BA +S31508002CD014F941E0387800280CD1022085F89C02C6 +S31508002CE03878686039782800FFF74FFB280000F02D +S31508002CF004F927E038786968884220D06968C9B23B +S31508002D002800FFF742FB3878686039782800FFF713 +S31508002D102DFB04002000C0B200280CD0310028008A +S31508002D2000F092F86968C9B22800FFF72EFB022066 +S31508002D3085F89C0206E0280000F0DFF802E028008B +S31508002D4000F0DBF808E03100280000F07DF839785B +S31508002D502800FFF71AFB03242000C0B2F2BD0000CA +S31508002D604C10002080B5CA88012A02D000F06CF801 +S31508002D7016E090F89C22521E012A02D9921E08D00B +S31508002D800CE000218160012210F1080100F098F89A +S31508002D9006E00122011D00F093F801E000F054F866 +S31508002DA001BD80B590F89C22521E022A15D8CA8801 +S31508002DB0022A02D000F048F811E00121C160D0F8DB +S31508002DC0A412002903D0C16851F00201C160022291 +S31508002DD010F10C0100F074F801E000F035F801BDBF +S31508002DE080B54988012904D10121C0F8A41200F050 +S31508002DF084F801BD80B590F89C22521E022A08D894 +S31508002E004988012904D10021C0F8A41200F075F8F8 +S31508002E1001E000F019F801BD38B504000878207003 +S31508002E20481C01786170451C2800FFF743FC608048 +S31508002E30681C451C2800FFF73DFCA080681C401C48 +S31508002E40FFF738FCE08031BD10B504008021200072 +S31508002E50FFF7B1F900212000FFF7ADF910BDF8B56D +S31508002E6004000D0017000026002C1ED0200000F0DC +S31508002E701DF84000801C388038783100C9B2685483 +S31508002E80761C03203100C9B26854761C0AE0207803 +S31508002E903100C9B26854641C761C00203100C9B2DE +S31508002EA06854761C20780028F1D1F1BD0200002074 +S31508002EB001E0401C521C11780029FAD1C0B27047B3 +S31508002EC080B513000222C0F894228361C3610A0008 +S31508002ED00021FFF7B1F9002002BD80B513000A00F2 +S31508002EE00021FFF7A9F9002002BD80B513000A00EA +S31508002EF00021FFF7AEF9002002BD80B50421C0F815 +S31508002F009412002300220021FFF796F9002002BD43 +S31508002F1080B50521C0F89412002300220021FFF78E +S31508002F2098F9002002BD80B5FFF7B8FB01BD80B552 +S31508002F30FFF7B9FB01BD0000816170470904816193 +S31508002F40704714490880704710B5FEF7FCF8124C14 +S31508002F502168884216D311490878002806D101202D +S31508002F60087080210E48FFF7E7FF05E0002008708B +S31508002F7080210B48FFF7E2FFFEF7E5F805490988C7 +S31508002F804018206010BD80B580210548FFF7D6FFA0 +S31508002F9001BD00004410002030100020471000201A +S31508002FA00004024038B50400002C01D10120AEE02F +S31508002FB094F82000002802D1200000F0B0FA20681A +S31508002FC0006830F0020021680860FEF7CDF80500B9 +S31508002FD02068406880070DD5FEF7C6F8401B0B2809 +S31508002FE0F6D3606A50F400306062052084F8200049 +S31508002FF001208CE02068006850F001002168086014 +S31508003000FEF7B2F8050020684068C0070DD4FEF741 +S31508003010ABF8401B0B28F6D3606A50F400306062A8 +S31508003020052084F82000012071E0207E012806D1C1 +S315080030302068006850F080002168086005E0206874 +S31508003040006830F0800021680860607E012806D19B +S315080030502068006850F040002168086005E0206894 +S31508003060006830F0400021680860A07E012806D17B +S315080030702068006850F020002168086005E0206894 +S31508003080006830F0200021680860E07E012806D13B +S315080030902068006830F010002168086005E02068A4 +S315080030A0006850F0100021680860207F012806D1CA +S315080030B02068006850F008002168086005E020686C +S315080030C0006830F0080021680860607F012806D192 +S315080030D02068006850F004002168086005E0206850 +S315080030E0006830F0040021680860A168E0680143C0 +S315080030F020690143606901436068401E01432068F6 +S31508003100C16100206062012084F82000002032BDE1 +S3150800311030B4026890F820201300DBB2012B03D0EC +S31508003120D2B2022A40F07F80594AD2F8000250F003 +S315080031300100C2F80002D2F8000230F47C50C2F84E +S315080031400002D2F800024B6A50EA0320C2F80002D5 +S3150800315001200B7D13F01F0310FA03F3D2F81C02AB +S315080031609843C2F81C02C869002816D1D2F80C0286 +S315080031709843C2F80C02486902EBC000CC684D6857 +S31508003180C5EA0444C0F84042486902EBC0008C68AE +S315080031900D68C5EA0444C0F84442C869012816D136 +S315080031A0D2F80C021843C2F80C02486902EBC000B8 +S315080031B00C684D68C5EA0444C0F84042486902EB09 +S315080031C0C0008C68CD68C5EA0444C0F844428869E2 +S315080031D0002805D1D2F804029843C2F8040204E094 +S315080031E0D2F804021843C2F804020869002805D177 +S315080031F0D2F814029843C2F8140204E0D2F8140272 +S315080032001843C2F81402086A012804D1D2F81C022D +S315080032100343C2F81C32D2F8000240084000C2F844 +S315080032200002002004E0416A51F480214162012035 +S3150800323030BC704738B5040094F82000012821D125 +S31508003240022084F8200020680068400840002168B1 +S315080032500860FDF789FF050020684068C0070DD59E +S31508003260FDF782FF401B0B28F6D3606A50F4003046 +S315080032706062052084F82000012008E000206062D2 +S31508003280002004E0606A50F400206062012032BD2C +S315080032900064004070B490F820500468A6688C68F2 +S315080032A0002CFFD02C00E4B2012C02D0EDB2022D86 +S315080032B06ED116F0E05F65D0C6F30164032C05D322 +S315080032C0416A51F400014162012066E00125A540EA +S315080032D01D608B68002B09D10B68CD6855EA4355EC +S315080032E0036826013344C3F880510AE04B688D68A9 +S315080032F055EAC305CB681D43036826013344C3F862 +S3150800330080510B69056826013544C5F88431097D65 +S3150800331001290BD1016823011944D1F8841151F40C +S315080033208071036825012B44C3F88411D1799379F8 +S315080033301B0453EA0163517953EA012311790B43BC +S31508003340016825012944C1F88C31D17893781B048A +S3150800335053EA0163517853EA012311780B43016854 +S3150800336022011144C1F88831016822011144D1F8BB +S31508003370801151F00101006822011044C0F8801143 +S3150800338000200AE0416A51F400114162012004E07C +S31508003390416A51F480214162012070BC704710B423 +S315080033A00200002092F820301C00E4B2012C02D062 +S315080033B0DBB2022B07D11268926812EA8162B2EB7D +S315080033C0816F00D0012010BC704730B490F82040BF +S315080033D02500EDB2012D03D0E4B2022C40F098800E +S315080033E000290AD10468E46814F0030F10D1416A71 +S315080033F051F40011416201208FE00468246914F039 +S31508003400030F05D1416A51F400114162012084E09D +S3150800341004680D012C44D4F8B04114F004049460F7 +S315080034209468002C07D104680D012C44D4F8B041E7 +S31508003430640D146006E004680D012C44D4F8B0410C +S31508003440E408546004680D012C44D4F8B04114F023 +S315080034500204D46004680D012C44D4F8B44114F075 +S315080034600F04146104680D012C44D4F8B441C4F364 +S315080034700724946104680D012C44D4F8B441240C43 +S31508003480546102680C012244D2F8B8211A70026805 +S315080034900C012244D2F8B821120A5A7002680C01AB +S315080034A02244D2F8B821120C9A7002680C01224400 +S315080034B0D2F8B821120EDA7002680C012244D2F84A +S315080034C0BC211A7102680C012244D2F8BC21120AE6 +S315080034D05A7102680C012244D2F8BC21120C9A7166 +S315080034E002680C012244D2F8BC21120EDA710029B6 +S315080034F006D10168C96851F020010068C16005E07D +S315080035000168096951F0200100680161002004E0A2 +S31508003510416A51F480214162012030BC70477047EE +S31508003520DFF8DC04016851F0010101607047DFF83B +S31508003530D0040068400810F001007047DFF8C01496 +S315080035400A6832F0F80252EAC0020A607047DFF8E9 +S31508003550B4040068400810F001007047DFF8AC04B6 +S31508003560006810F00C007047DFF8A004006810F03F +S31508003570F0007047DFF89404006810F4E0507047D4 +S31508003580DFF88804006810F4604070470100DFF82F +S3150800359080040068084050EA014070470100DFF8DF +S315080035A070040068084050EA01407047DFF850048C +S315080035B00068400E10F001007047DFF858040068F4 +S315080035C010F480007047DFF84C040068C0F38810D8 +S315080035D07047DFF84004006810F440307047DFF8A1 +S315080035E03404006810F03F007047DFF814040068E0 +S315080035F0C00E10F001007047DFF804040068400FA1 +S3150800360010F00100704780B5FFF78AFFFFF78FFFBC +S315080036100128FBD10020DFF8F4130860DFF8E01377 +S3150800362008680090009ADFF8F803024000920098B4 +S3150800363008601020FFF782FFFFF7B8FF0028FBD1CC +S31508003640FFF7D3FF0028FBD1FFF7D6FF0028FBD1F1 +S31508003650DFF8D003DFF8BC130860DFF8CC03DFF827 +S31508003660B8130860DFF8B4130860DFF8C003016810 +S3150800367031F4FE410160016851F47F010160DFF811 +S3150800368088030168490849000160016851F08071A2 +S315080036900160002002BD10B5040000F05CF920604E +S315080036A0206800F06CF96060606800F073F9A0604B +S315080036B0606800F079F9E06010BD10B500240328B1 +S315080036C024D1FFF763FFDFF86813401A04D0401EC1 +S315080036D006D0401E0BD011E000F03DF904008DE045 +S315080036E0FFF725FF002801D0DFF8484386E0FFF7FB +S315080036F02EFF002801D04FF400447FE000F02BF99C +S3150800370000F03DF900F050F9040077E00C2824D1C8 +S31508003710FFF73CFFDFF82013401A04D0001F06D03D +S31508003720001F0BD011E000F016F9040066E0FFF761 +S31508003730FEFE002801D0DFF8FC425FE0FFF707FF36 +S31508003740002801D04FF4004458E000F004F900F0D6 +S3150800375016F900F01FF9040050E0B0F5406F27D1C4 +S31508003760FFF714FFDFF8D412884207D0DFF8D0122B +S31508003770884207D0B0F10C2F0BD011E000F0EBF81F +S3150800378004003BE0FFF7D3FE002801D0DFF8A4428F +S3150800379034E0FFF7DCFE002801D04FF400442DE0AA +S315080037A000F0D9F800F0EBF800F0FEF8040025E088 +S315080037B0302823D1FFF7EAFEDFF88812401A04D032 +S315080037C0103806D010380BD011E000F0C4F8040009 +S315080037D014E0FFF7ACFE002801D0DFF858420DE0F0 +S315080037E0FFF7B5FE002801D04FF4004406E000F0CC +S315080037F0B2F800F0C4F800F0CDF80400200010BDBF +S3150800380010B50024C02824D1FFF7C8FEDFF8381207 +S31508003810401A04D0403806D040380BD011E000F0EA +S315080038209AF8040095E0FFF782FE002801D0DFF839 +S3150800383004428EE0FFF78BFE002801D04FF40044C7 +S3150800384087E000F088F800F09AF800F0A3F8040082 +S315080038507FE0B0F5407F27D1FFF7A0FEDFF8EC1137 +S31508003860884207D0DFF8E811884207D0B0F1032F65 +S315080038700BD011E000F06FF804006AE0FFF757FE7E +S31508003880002801D0DFF8AC4163E0FFF760FE0028AE +S3150800389001D04FF400445CE000F05DF800F06FF8EA +S315080038A000F078F8040054E0B0F5405F27D1FFF740 +S315080038B075FEDFF8A011884207D0DFF89C11884210 +S315080038C007D0B0F1302F0BD011E000F044F8040017 +S315080038D03FE0FFF72CFE002801D0DFF8584138E01A +S315080038E0FFF735FE002801D04FF4004431E000F020 +S315080038F032F800F044F800F04DF8040029E0B0F57D +S31508003900404F26D1FFF74AFEDFF85011884207D00C +S31508003910DFF84C11884207D0B0F1C02F0BD011E068 +S3150800392000F019F8040014E0FFF701FE002801D0A2 +S31508003930DFF800410DE0FFF70AFE002801D04FF43A +S31508003940004406E000F007F800F019F800F022F845 +S315080039500400200010BD80B50020FFF7FFFD0028F9 +S3150800396004D0042804D0082804D006E0314805E02D +S315080039703C4803E000F022F800E02E4802BD10B5EE +S315080039800400FFF7F1FD3849C0F30310085CC44092 +S31508003990200010BD10B50400FFF7ECFD3349800A7E +S315080039A0085CC440200010BD10B50400FFF7E8FD10 +S315080039B02E49400B085CC440200010BD70B500209D +S315080039C00020FFF7FAFD002803D0B0F5800F02D0DB +S315080039D003E0184C02E0234C00E0164CFFF7FFFD0D +S315080039E00500FFF7F0FD0600B4FBF5F006FB00F650 +S315080039F0FFF7EFFD000C401C4000B6FBF0F070BD71 +S31508003A0000380240703802407438024008380240D4 +S31508003A109038024004380240843802408838024010 +S31508003A20FFFFF2EA10300024003000240C38024070 +S31508003A30010003000024F40004000C000004000C3C +S31508003A400008000C100030004000C0000001000310 +S31508003A50000200030010003000200030004000C0C3 +S31508003A60008000C000127A00E45E0008205F0008AB +S31508003A7038B500F02AF9DFF804544021681C00F034 +S31508003A803BF92870DFF8F8434021601C00F034F950 +S31508003A9020702878FF2802D02078FF2804D18421B6 +S31508003AA0DFF8E003FEF7DBFDDFF8DC430022DFF892 +S31508003AB0DC132000FEF7FCFBDFF8D4132000FEF72A +S31508003AC03BFC0120FEF7F3FD2000FEF749FCD4F885 +S31508003AD0C402FDF7F9FE00F00EFAB0F5FA6F03D24C +S31508003AE04FF4FA6000F004FA31BD10B5DFF89843D8 +S31508003AF0D4F8C402FDF7FBFE2000FEF7F8FB002011 +S31508003B00FEF7D5FD10BD70B505000C002000C0B24B +S31508003B10402804DBB921DFF86C03FEF7A0FD20007E +S31508003B20C0B200F069F8C0B2012804D0BD21DFF8A0 +S31508003B305403FEF794FD00260EE0FFF7F8F930006F +S31508003B4080B2285C00F058F8C0B2012803D0C6211C +S31508003B50CC48FEF784FD761C30002100C9B280B23D +S31508003B6089B28842E9D370BD2DE9F04105000E00FF +S31508003B70C548D0F8C402FDF723FCC64C20780028B7 +S31508003B8013D1C54D280000F02FF801280AD128784E +S31508003B90002807D02878402804DA01202070002061 +S31508003BA0BE4908700020BDE8F081BC4FDFF8E88206 +S31508003BB038784044401C00F017F80128F2D13878CC +S31508003BC0401C3870387898F800108842EAD13A785C +S31508003BD092B218F10101280000F0C6F90020207001 +S31508003BE0387830700120DEE780B50100A4480078F7 +S31508003BF000F0E7F8C0B202BD80B50100C9B29F481F +S31508003C00007800F090F8C0B202BD7CB59B4C2078D5 +S31508003C1000F021F905002800C0B2002826D02800A7 +S31508003C20C0B2412800DB4025002612E0694620780C +S31508003C3000F0C7F8C0B2012804D04FF4A371914828 +S31508003C40FEF70DFD9DF8000095493200D2B2885462 +S31508003C50761C30002900C0B2C9B28842E6D3EDB25C +S31508003C602B008F4A81218848FEF7E6FA73BDF8B51E +S31508003C700600002000F003FA0400834D3100C9B2A3 +S31508003C802800FEF7F3FA070000260FE0300080B29E +S31508003C90215C7B48007800F046F8C0B2012804D0C1 +S31508003CA04FF4B4717748FEF7DAFC761C3000390019 +S31508003CB080B289B28842E9D300F0E1F902004023D4 +S31508003CC001212800FEF7C5FAF1BD10B4754B19009D +S31508003CD013F11802002004E088744A61183118327A +S31508003CE0401C0400E4B2002CF6D088740020486119 +S31508003CF06D48036010BC704710B46B4B1A68002AF5 +S31508003D0001D1FF200DE01A6854691C601174906097 +S31508003D10D060002353741060C9B20844401E506036 +S31508003D20907C10BC704738B505000C002800C0B25E +S31508003D30022804DB4FF4E0715248FEF790FC182085 +S31508003D4058492A00D2B242430A44527C2B00DBB2BD +S31508003D5043430B441B7C9A4201D1002030E02A00E1 +S31508003D60D2B242430A44D26814702A00D2B24243FD +S31508003D700A442B00DBB243430B445B7C5B1C537445 +S31508003D802A00D2B242430A442B00DBB243430B4417 +S31508003D90DB685B1CD3602A00D2B242430A445268ED +S31508003DA02B00DBB243430B44DB689A4207D22A0056 +S31508003DB0D2B242430A44EDB245434859D060012085 +S31508003DC032BD38B504000D002000C0B2022804DB5D +S31508003DD04FF4F1712B48FEF742FC1821314A2000B6 +S31508003DE0C0B248431044407C002801D1002031E08D +S31508003DF02000C0B24843104480680078287020002C +S31508003E00C0B2484310442300DBB24B4313445B7CE7 +S31508003E105B1E43742000C0B2484310442300DBB243 +S31508003E204B4313449B685B1C83602000C0B2484325 +S31508003E30104440682300DBB24B4313449B68984206 +S31508003E4007D22000C0B248431044E4B24C4311598B +S31508003E508160012032BD10B504002000C0B20228DE +S31508003E6004DB40F202210748FEF7F9FB0D49E4B2EC +S31508003E701820444301EB0400407C10BD2C0E0020A2 +S31508003E80700E0020505D0008C40400206C0000205D +S31508003E90140000204B100020F40E00204A100020C9 +S31508003EA0340F0020B40F00203C10002080B50120FC +S31508003EB01749087000F022F800F001F801BD10B5A6 +S31508003EC000F078F9012812D0114C207801280ED17B +S31508003ED0FDF739F90F490A680F4909688A1812F572 +S31508003EE0FA72904203D30020207000F01BF810BD30 +S31508003EF008490860704707480068704780B5044855 +S31508003F000078012803D1FDF71EF90349086001BDB1 +S31508003F10461000202C1000202810002080B500F044 +S31508003F2053F901BD10B500F05FF9002816D0FEF769 +S31508003F30A4FB002812D000F0EBF8FDF7F7F800F024 +S31508003F4070F900F055F9064908400649086000F07E +S31508003F504FF9001D046800F039F9A04710BD0000AC +S31508003F6080FFFF1F08ED00E070B504000D00160085 +S31508003F7005E0287820706D1C641CFEF7D8FF300019 +S31508003F80461E80B20028F4D170BD000038B5040082 +S31508003F9000254023022281212000FEF7EDF8402368 +S31508003FA0022201212000FEF7E7F84023354A0121C5 +S31508003FB02000FEF74EF92800C0B232BD38B504001D +S31508003FC0002581212000FEF7E9F801212000FEF7EF +S31508003FD0E5F82800C0B232BD38B50B0017222A4CC6 +S31508003FE014F109011D7815F0600F29D15D78062DA9 +S31508003FF004D00A2D14D00B2D17D021E05D88ADB260 +S315080040002D0AADB2212D07D114F11201DA88182A2A +S3150800401001DB172200E0DA8892B2FEF751FF0FE0C3 +S3150800402001221A49FEF74CFF0AE05988C9B200294D +S3150800403003D198781549086002E01900FEF704FFD5 +S31508004040002032BD80B5FFF7E0FD002002BD80B537 +S315080040500800C0B2FFF70BFE002002BD80B590F83D +S315080040609C02032801D1FFF7D0FD002002BD2021C4 +S315080040700180054870470A210180054870470148B4 +S3150800408070470000740F00204C00002040100020EC +S315080040900800002010B500F0E9F800F035FB434CA5 +S315080040A00120207000F015FC00202070FFF7E0FCCE +S315080040B00220207010BD1CB53D4C6946200000F05A +S315080040C0BBFB012807D10120384908709DF800106C +S315080040D0200000F0EBF86946200000F036FC0128C5 +S315080040E007D10020314908709DF80010200000F023 +S315080040F0DDF869462000FFF737FD012807D10220C1 +S315080041002A4908709DF80010200000F0CFF813BD6A +S3150800411080B5FFF7EAFC01BD70B504000D00234E1B +S315080041203078012804D12900C9B2200000F055FBD7 +S315080041303078002804D12900C9B2200000F0E4FB39 +S315080041403078022804D12900C9B22000FFF7DBFC29 +S3150800415000F0A6F870BD15480078002805D002289A +S3150800416007D004D3032806D007E0402006E008203D +S3150800417004E03F2002E0002000E0402080B27047C3 +S315080041800A480078002805D0022807D004D3032857 +S3150800419006D007E0402006E0082004E03F2002E0C1 +S315080041A0002000E0402080B270470000BC000020DC +S315080041B0B40E002010B5002400F069F8002800D0DD +S315080041C001242000C0B210BD72B6704762B67047AF +S315080041D080B500F037FC01BD80B500F03CFC02BD9F +S315080041E080B500F06DFC02BD80B500F0C7FC02BDCD +S315080041F080B500F004FD02BD80B500F08AFC0028F9 +S3150800420001D1002001E000F0E1FC02BD80B50320E9 +S3150800421000F065FE002000F089FE00F0BBFF0020DC +S3150800422002BD80B50C485FF0FF31016000220260D4 +S315080042300A48016000220260094801600022026003 +S3150800424008480160002202600748016000210160F9 +S3150800425001F012F8002002BD20380240243802403E +S31508004260103802401438024018380240DFF8C803F4 +S315080042700021017000218164002180F8431000218B +S31508004280A0F8441000218170002141707047DFF8C2 +S31508004290A8030078002801D1002000E0012070471B +S315080042A00020DFF8941381F84300704710B50178B1 +S315080042B0FF2917D100F08CF8DFF87C4394F8430007 +S315080042C0012802D1102000F07BF8B4F94400012837 +S315080042D007DB012084F84300B4F94410E01C00F021 +S315080042E053F810BDDFF85013097801294BD101782E +S315080042F0C92932D0CC293FD0CF293AD0D0292FD0BE +S31508004300D12933D0D2292ED0F32917D0F4290FD0AA +S31508004310F5290AD0F6290ED0FA2912D0FC2913D08D +S31508004320FD2914D0FE2915D029E000F0B5F8C3E719 +S3150800433000F0D1F8C0E700F0A6F8BDE700F0ECF809 +S31508004340BAE700F08EF8B7E700F086F8B4E700F0B1 +S3150800435072F8B1E700F063F8AEE700F004F9ABE7EE +S3150800436000F020F9A8E700F0E9F8A5E700F048F919 +S31508004370A2E700F057F99FE700F062F99CE72020D2 +S3150800438000F01EF898E7ACE780B589B2FFF7C4FEDF +S3150800439001BDF8B504000D001600002704E02078DA +S315080043A0C719641CFEF7C3FD2800451E0028F6D170 +S315080043B0FFB237600120F2BD00209F494870704760 +S315080043C09D49FE22CA7008710220A1F84400704770 +S315080043D010B5FFF7F1FF984C01202070FF20E07020 +S315080043E000202071207950F01000207100206071A3 +S315080043F060796071FFF7AFFEA071FFF7C1FEE0714B +S31508004400FFF7BEFE80B2000A20720120607201200A +S31508004410A0720820A4F84400FFF7DAFE10BD10B514 +S31508004420854C00202070FFF7C7FFFF20E0700120B1 +S31508004430A4F8440010BD8048FF21C1700021017115 +S3150800444041784171002181710021C17100210172F9 +S315080044500621A0F84410704780B50020FFF7B0FF8A +S3150800446001BD7548FF21C17074498164002101713D +S3150800447000214171002181710721C0F80710082128 +S31508004480A0F8441070476C49FF22CA7040688864D7 +S315080044900120A1F84400704738B50400FFF75BFE19 +S315080044A080B2401E6178884203DA2220FFF788FF2F +S315080044B010E06278604D281D92B2A96CFFF754FD92 +S315080044C0FF20E870A86C61784018A8646078401CE2 +S315080044D0A5F8440031BD38B50400FFF73CFE80B2AC +S315080044E0401E6178884203DA2220FFF769FF12E04E +S315080044F0514D6068A8646278281D92B2A96CFFF7CE +S3150800450033FDFF20E870A86C61784018A8646078CD +S31508004510401CA5F8440031BD10B5474CFF21E17099 +S31508004520E21D4168A06CFFF734FF2071002060711E +S315080045300020A0710820A4F8440010BD10B53E4C18 +S31508004540FF20E0700020207100206071FFF703FE55 +S31508004550A0710020E0710020207200206072072000 +S31508004560A4F8440010BD38B50400FFF7F4FD0100B7 +S31508004570314D621C89B2491EA86CFFF72DFE002832 +S3150800458003D13120FFF71CFF0BE0FF20E870FFF78F +S31508004590E2FDA96C80B2401E4018A8640120A5F867 +S315080045A0440031BD38B50400FFF7D5FD80B2801E42 +S315080045B06178884203DA2220FFF702FF1FE01E4DCA +S315080045C0FF20E8700120A5F844006078002807D18C +S315080045D0FFF712FE002802D13120FFF7F1FE0EE0A8 +S315080045E0A21C6178A86CFFF7F7FD002803D13120DB +S315080045F0FFF7E6FE03E0A86C61784018A86431BDB1 +S3150800460010B50D4C4168A06CFFF7EAFD002803D1F0 +S315080046103120FFF7D5FE04E0FF20E0700120A4F862 +S31508004620440010BD80B5FFF77DFC0348FF21C1702B +S315080046300121A0F8441001BD9C0D0020305F000840 +S3150800464080B53120FFF7BCFE01BD0000F8B584B087 +S3150800465004000D0016001F006846FFF71CF80298B4 +S315080046604FF47A71B0FBF1F1002200E0521C100001 +S31508004670C0B2122845D2864B200080B294465FFA13 +S315080046808CFC13F81CC096465FFA8EFE03EB4E0EA2 +S315080046909EF801E01EEB0C0C1CF1010C0CFB00F063 +S315080046A0B1FBF0FC00FB1C100028DFD1200080B213 +S315080046B094465FFA8CFC13F81CC096465FFA8EFE89 +S315080046C003EB4E0E9EF801E01EEB0C0C1CF1010CE0 +S315080046D00CFB00F0B1FBF0F0288028880028C5D034 +S315080046E0288840F2014C6045C0DA1000C0B213F8C1 +S315080046F010003070D2B203EB4200407838700120C7 +S3150800470000E0002005B0F0BD30B58BB00020ADF854 +S31508004710020000208DF8010000208DF8000040F20C +S3150800472067656B460DF101020DF102014FF4FA704F +S31508004730FFF78CFF002803D1B5215648FDF78FFFF8 +S31508004740554C5648206000202076002060760020D0 +S31508004750A0760120E07600202077002060770020F0 +S31508004760A0600020E0609DF80100401E0004206162 +S315080047709DF80000401E00056061BDF802006060FB +S315080047802000FEF70FFC002D02D46D05444805E015 +S3150800479025F00045ED0055F0040542480021069134 +S315080047A000210791012108912900090C0191ADB258 +S315080047B002950100090C039180B20490002005902F +S315080047C0012009900E200A9001A92000FEF7A0FCFE +S315080047D02000FEF72FFD0BB030BD30B587B00200C4 +S315080047E040F2E170002803D401900020039004E011 +S315080047F020F0004002900420039000200490C9B2E3 +S315080048000591254D6B4601A92800FEF743FDC0B268 +S3150800481000280FD1FCF797FC0400323400992800D1 +S31508004820FEF7BDFD002805D0FEF781FBFCF78BFCE3 +S315080048308442F3D207B030BD78B587B003000C00C8 +S3150800484040F2676600256A4600211348FEF7BDFD5B +S31508004850002812D1002E07D40098B0420DD1029834 +S3150800486000280AD1012508E026F000460198B04242 +S3150800487003D10298042800D101252800C0B20128D6 +S3150800488001D1049820702800C0B208B070BD00009D +S31508004890EC5D0008145D0008E40F00200064004089 +S315080048A00400E0FFFCFF1F00016851F001010160F0 +S315080048B07047C069400910F001007047C069C00917 +S315080048C010F001007047406AC0B27047C9B28162F1 +S315080048D0704718B587B04FF46140009000200190EA +S315080048E000200290002003900C20049000200590E0 +S315080048F0002006904D4C6946200000F03CFD200043 +S31508004900FFF7D2FF08B010BD70B504000D002800EF +S31508004910C0B2412803DB81214548FDF7A0FE2800E7 +S31508004920C0B200F06BF8002607E0FEF700FB300087 +S3150800493080B2205C00F062F8761C30002900C9B20B +S3150800494080B289B28842F0D370BD2DE9F0410500E6 +S315080049500E00384C2078002815D1374D280000F075 +S315080049603DF8012837D12878002834D028784128FE +S3150800497031DAFCF7E8FB3149086000203049087055 +S315080049800120207027E02E4FDFF8AC8038784044AD +S31508004990401C00F023F8012814D13878401C3870E0 +S315080049A0387898F80010884215D13A7892B218F1FA +S315080049B001012800FFF7D8FA0020207038783070F7 +S315080049C0012009E0FCF7BFFB1C49096864318142F4 +S315080049D001D2002020700020BDE8F08138B504001F +S315080049E0124D2800FFF765FF002805D02800FFF7BD +S315080049F06AFF2070012000E0002032BD38B50100B2 +S31508004A000A4DC9B22800FFF761FFFCF79CFB0400BA +S31508004A100A342800FFF752FF002805D1FEF787FA67 +S31508004A20FCF791FB8442F4D231BD000000480040F7 +S31508004A30D45C000849100020E80D0020341000203E +S31508004A40481000205FF0FF30DFF8D4130860DFF865 +S31508004A50D41308607047F8B504000D001600DFF897 +S31508004A60C873B96CF86C4118491E091B681E814247 +S31508004A7001D2002023E0200000F0A9F9FF2805D084 +S31508004A802819401E00F0A3F9FF2801D1002016E0DE +S31508004A902100490A4FF4007041433868814207D122 +S31508004AA02B0032002100DFF87C0300F0DCF806E07A +S31508004AB02B0032002100DFF8680300F0D4F8F2BDBD +S31508004AC070B504000D00DFF86003816CC06C4118F6 +S31508004AD0491E091B681E814201D2002018E02000E9 +S31508004AE000F075F906002C19641E200000F06FF915 +S31508004AF03100C9B2FF2903D00100C9B2FF2901D18B +S31508004B00002005E00100C9B23000C0B200F01EF96D +S31508004B1070BD80B500200090C249086810F1010FE9 +S31508004B2001D1012029E0009A486882180092009A6B +S31508004B30886882180092009AC86882180092009ABB +S31508004B40086982180092009A486982180092009AA9 +S31508004B50886982180092009AC8698218009200989B +S31508004B60C04300900098401C00906A460421AE4855 +S31508004B70006810F5E470FFF76EFF02BD0021AA4A2F +S31508004B801068006841181068001D00684118106810 +S31508004B9008300068411810680C3000684118106821 +S31508004BA01030006841181068143000684118106801 +S31508004BB0183000684118106810F5E470006841184C +S31508004BC0002901D1012000E00020704780B59548F2 +S31508004BD0016811F1010F05D000F08FF8002801D106 +S31508004BE000200BE08E48016811F1010F05D000F096 +S31508004BF084F8002801D1002000E0012002BD8A487F +S31508004C000068704780B5CA0501D000200BE002682D +S31508004C108A4201D1012006E001604FF40072001DAE +S31508004C20FFF7A2F9012002BD38B504000D007D4842 +S31508004C30844208D17A4C29002000FFF7E3FF0028B8 +S31508004C400FD100200EE078490A68954202D1040087 +S31508004C500D68F0E7200000F050F80028EBD100209E +S31508004C6000E0200032BD2DE9F04104008846160018 +S31508004C701D0047467F0A4FF400704743206810F12D +S31508004C80010F07D139002000FFF7BCFF002801D12A +S31508004C9000202EE02068B84208D039002000FFF72F +S31508004CA0C3FF0400002C01D1002022E02068B8EBE5 +S31508004CB0000804EB080010F10408FEF738F9201D77 +S31508004CC0B8EB0000B0F5007F09D317F50071200096 +S31508004CD0FFF7AAFF0400002C0DD014F10408307861 +S31508004CE088F8000018F10108761C6D1E002DE4D125 +S31508004CF00120BDE8F0810020FBE72DE9F041050021 +S31508004D00012600F001FC002704E0D8F80000A042C4 +S31508004D1015D17F1C802F13D2D5F8008018EB870891 +S31508004D2005EB87004468FEF702F922000023414696 +S31508004D30022000F0A3FB0028E7D0002600E00026AA +S31508004D4000F0F2FB3000C0B2BDE8F08178B585B05E +S31508004D5004000D0001260020009028002100C0B2A2 +S31508004D60C9B2884200D200262F482100027AC9B269 +S31508004D70914205D390F850002900C9B2884200D262 +S31508004D8000263000C0B201281DD100200190022063 +S31508004D9004900120039000F0B7FB00E0641C280093 +S31508004DA02100C0B2C9B288420BD3FEF7C0F8200072 +S31508004DB0C0B20290694601A800F064FC0028EDD054 +S31508004DC0002600F0B1FB3000C0B206B070BD70B569 +S31508004DD00400FF25002600E0761C3000C0B2072834 +S31508004DE01AD2FEF7A4F80C210F4A3000C0B2484385 +S31508004DF010588442F0D33000C0B2484313583000EC +S31508004E00C0B2484310444068C3189C42E4D2F6B284 +S31508004E104E4302EB0600057A2800C0B270BD0000BA +S31508004E2094070020980900202C5C000810F0070061 +S31508004E30374B1A684FF6FF010A40364951EA0021F6 +S31508004E400A431A60704732480068C0F30220704768 +S31508004E50020052B2002A04D409012F4A40B2115462 +S31508004E6007E009012D4A40B210F00F00104400F87F +S31508004E70041C704710B410F00700D0F10703052B87 +S31508004E8001D3042301E0D0F10703041D072C01D246 +S31508004E90002000E0C01E012414FA03F35B1E19402B +S31508004EA0814014FA00F0401E1040084310BC7047B9 +S31508004EB080B5411EB1F1807F01D301200EE0401E6E +S31508004EC0174908600F215FF0FF30FFF7C1FF002088 +S31508004ED014490860072014490860002002BD80B5FF +S31508004EE0FFF7A4FF01BD70B504000D0016000020F1 +S31508004EF0FFF7A9FF32002900FFF7BCFF01002000D9 +S31508004F0040B2FFF7A5FF70BD80B5FFF7D1FF02BD20 +S31508004F100CED00E00000FA0500E400E018ED00E002 +S31508004F2014E000E018E000E010E000E010B504002E +S31508004F304FF47A700D490978B0FBF1F00C4909680D +S31508004F40B1FBF0F0FFF7E0FF002801D001200CE0EC +S31508004F50102C09D2002221005FF0FF30FFF7C3FFB3 +S31508004F6004480460002000E0012010BDBD000020B8 +S31508004F700400002000000020D948016851F480315F +S31508004F8001607047D6490A6832F440421043086007 +S31508004F907047D448016851F4802101607047D148B0 +S31508004FA0016851F4803101607047CE480068400CB2 +S31508004FB010F001007047CC490A6892089200104325 +S31508004FC008607047C848006810F00C007047C6496A +S31508004FD00A6832F0F002104308607047C2490A684E +S31508004FE032F4E052104308607047BF490A6832F449 +S31508004FF06042104308607047BA48016851F08071F2 +S3150800500001607047B7480068400E10F0010070470D +S3150800501070B4B64D2E68B64C26403043084350EA65 +S3150800502082101843286070BC704770B4AF4D2E6864 +S31508005030B04C26403043084350EA82101843286093 +S3150800504070BC704781B0AC490A6802430A600968B7 +S3150800505008400090009801B07047A7490A6832EAEC +S3150800506000000860704781B0A4490A6802430A60D4 +S31508005070096808400090009801B070479F490A687F +S3150800508032EA00000860704781B09D490A68024309 +S315080050900A60096808400090009801B0704798496E +S315080050A00A6832EA00000860704781B095490A68C4 +S315080050B002430A60096808400090009801B07047EA +S315080050C090490A6832EA0000086070478E490A6803 +S315080050D0120912011043086070478B48006810F0E7 +S315080050E00F00704709048161704780B500F005F824 +S315080050F000F05CFB00F068FBFCE780B5FFF786F87C +S3150800510000F001F801BD80B50720FFF7DFFFFFF7C4 +S31508005110E4FF072803D067217C48FDF7A0FA4FF47F +S315080051204040FFF72FFFFFF727FFFFF732FFFFF794 +S3150800513036FFFFF73AFF0128FBD100234FF4D87258 +S3150800514008215FF48000FFF763FF5FF010634FF4F8 +S31508005150D87208215FF48000FFF767FFFFF74CFF5E +S31508005160FFF750FF0128FBD10020FFF730FF4FF46F +S31508005170A050FFF733FF4FF40040FFF736FF022039 +S31508005180FFF719FFFFF71EFF0828FBD1604800F05C +S3150800519025FB01BD38B586B04FF48040FFF785FF83 +S315080051A05FF08050FFF770FF0120FFF74BFF0220EA +S315080051B0FFF748FF0420FFF745FF0820FFF742FFE7 +S315080051C05FF48020FFF760FF5FF00070FFF75CFF79 +S315080051D0802000900120019000200290002003907A +S315080051E0002004904B4C6946200000F011FC8021F9 +S315080051F02000FFF777FF4FF4005000900020019041 +S31508005200002004906946444800F002FC4FF44075BB +S3150800521000950220019003200290002003900020B0 +S3150800522004900720059069463C4800F0F1FB00957C +S315080052300220019003200290002003900020049091 +S31508005240092005906946200000F0E2FB4FF4C050A3 +S315080052500090022001900320029000200390002075 +S3150800526004900A20059069462D4800F0D1FB80205D +S31508005270FFF7F9FE07B030BD10B5FEF7C4F9254CA7 +S3150800528080212000FFF72EFF244800F02FFB22483C +S3150800529000F02CFB200000F029FB214800F026FB3B +S315080052A08020FFF7EBFE5FF00070FFF7F8FE5FF473 +S315080052B08020FFF7F4FE0820FFF7CFFE0420FFF753 +S315080052C0CCFE0220FFF7C9FE0120FFF7C6FE5FF0FD +S315080052D08050FFF7E4FE4FF48040FFF7F1FE10BD63 +S315080052E00070004000380240083802400438024086 +S315080052F00080BCFF0080BFF03038024034380240DE +S315080053004038024044380240003C0240805C0008B5 +S3150800531000E6DF0C0004024000080240000C0240D0 +S3150800532000000240006810F001007047426832F43D +S315080053304052114341607047826832F4407211430B +S3150800534081607047B2F5004F0ED11A00520812EB71 +S315080053504102B2FBF3F189B24FF6F0720A40C1F38B +S3150800536042010A43C26005E011EB5301B1FBF3F1B8 +S3150800537089B2C1607047F8B505000F000126002400 +S315080053802800FFF7CFFF002862D129683A48014074 +S3150800539078680143F868014338690143B8690143ED +S315080053A02960B9682800FFF7C1FF79692800FFF767 +S315080053B0C3FF2948854204D10320FEF77EF904007D +S315080053C03AE02648854204D10C20FEF776F9040017 +S315080053D032E02348854204D13020FEF76EF90400F6 +S315080053E02AE02048854204D1C020FEF709FA0400C5 +S315080053F022E01D48854205D14FF44070FEF700FAB9 +S31508005400040019E01948854205D14FF44060FEF7BB +S3150800541054F9040010E01648854205D14FF440506F +S31508005420FEF7EEF9040007E01248854204D14FF46E +S315080054304040FEF7E5F90400002C09D0386800283A +S3150800544006D000263B68BA6921002800FFF77AFFD4 +S315080054503000C0B2F2BD0000001001400044004018 +S3150800546000480040004C0040005000400014014035 +S3150800547000780040007C0040F369FFEF2DE9F8430F +S3150800548081460E0014001D000120DFF8E071387D0A +S31508005490012801D1022035E0012038754CF2503838 +S315080054A0404600F048F80100C9B2002927D130006B +S315080054B022002B00B9F1000F07D0B9F1020F0ED068 +S315080054C008D3B9F1030F0ED010E01100C9B200F0ED +S315080054D091F80BE0110089B200F07BF806E01100A4 +S315080054E000F066F802E000F04EF8FFE7404600F0EC +S315080054F022F8DFF87C110A68520852000A60002177 +S315080055003975C0B2BDE8F283002059490A68002AF5 +S3150800551008D5594A594B1360594B13600968002935 +S3150800552000D50120C0B270475148016851F00041CA +S3150800553001600020704738B50400002000204B4960 +S315080055408861FBF711FE05004A480168C9030BD5B7 +S3150800555014F1010FF8D0002C04D0FBF705FE401B10 +S315080055608442F1D203200DE0016811F0F20F03D056 +S3150800557000F04FF8012005E00168C90701D50121AF +S315080055800160002032BD10B439490C6834F4407407 +S315080055900C600C6854F440740C600C6854F00104F8 +S315080055A00C600260001D0360BFF34F8F10BC70478C +S315080055B02F4A136833F440731360136853F4007367 +S315080055C01360136853F0010313600160BFF34F8F34 +S315080055D07047274A136833F440731360136853F40B +S315080055E080731360136853F0010313600180BFF3DF +S315080055F04F8F70471E4A136833F44073136013685D +S315080056001360136853F0010313600170BFF34F8FE3 +S31508005610704718480168890704D514498A6952F001 +S3150800562020028A610168C90604D510498A6952F0C0 +S3150800563010028A610168890604D50C498A6952F004 +S3150800564008028A610168490604D508498A6952F040 +S3150800565004028A610168090604D504498A6952F078 +S3150800566002028A61F2210160704700000C100020D6 +S31508005670103C02400C3C0240043C024023016745B2 +S31508005680AB89EFCD2DE9F04104000D000120002083 +S31508005690DFF81061307D012801D102203EE00120AB +S315080056A030754CF250373800FFF745FF0100C9B294 +S315080056B0002930D15FF0FF312960216801290DD119 +S315080056C0E068C0B200F02CF83800FFF734FFDFF8C6 +S315080056D0D8100A6832F004020A601CE0D4F8048084 +S315080056E001E018F10108A26861688A18904512D28B +S315080056F0E168C9B2404600F026F83800FFF71BFFFC +S3150800570029490A6832F07A020A600100C9B20029FA +S31508005710E7D0C5F8008000213175C0B2BDE8F08138 +S3150800572021490A6832F440720A600A6852F0040293 +S315080057300A600A68C0B2000250F48030104308605C +S31508005740BFF34F8F704700220A00D2B2002A01D158 +S3150800575000210EE00A00D2B2012A02D14FF480716C +S3150800576007E0C9B2022902D14FF4007101E04FF4F3 +S3150800577040710D4A136833F4407313601368194374 +S315080057801160116831F0F80111601168C00050F01D +S31508005790020008431060106850F480301060BFF3B0 +S315080057A04F8F70470C100020103C024080B5FEF762 +S315080057B0B5FBFDF7B8FBFBF7A9FCFEF709FDFEF7FD +S315080057C069FCFEF773FB01BD80B5FDF7B0FBFBF77F +S315080057D0B1FCFEF770FCFEF772FB01BD01490860DB +S315080057E0704700000400002030B4046891FAA1F361 +S315080057F0B3FA83F30325DBB25B009D40AC4391FA11 +S31508005800A1F1B1FA81F1C9B249008A402243026086 +S3150800581030BC704743688B43514319434160704716 +S3150800582030B4846891FAA1F3B3FA83F30325DBB2A3 +S315080058305B009D40AC4391FAA1F1B1FA81F1C9B27E +S3150800584049008A402243826030BC704730B4C4683D +S3150800585091FAA1F3B3FA83F30325DBB25B009D400B +S31508005860AC4391FAA1F1B1FA81F1C9B249008A4073 +S315080058702243C26030BC704730B4046A91FAA1F37F +S31508005880B3FA83F30F25DBB29B009D40AC4391FA34 +S31508005890A1F1B1FA81F1C9B289008A4022430262B4 +S315080058A030BC704730B4446A0B001B0A93FAA3F362 +S315080058B0B3FA83F30F25DBB29B009D40AC43090A7C +S315080058C091FAA1F1B1FA81F1C9B289008A4022435D +S315080058D0426230BC704742490A6810430860704704 +S315080058E03F490A6832EA00000860704710B500248C +S315080058F03C49884206D10120FFF7EDFF0120FFF75A +S31508005900EFFF6AE03849884206D10220FFF7E3FF35 +S315080059100220FFF7E5FF60E03449884206D10420FB +S31508005920FFF7D9FF0420FFF7DBFF56E0304988422E +S3150800593006D10820FFF7CFFF0820FFF7D1FF4CE07C +S315080059402C49884206D11020FFF7C5FF1020FFF723 +S31508005950C7FF42E02849884206D12020FFF7BBFF4F +S315080059602020FFF7BDFF38E02449884206D14020B1 +S31508005970FFF7B1FF4020FFF7B3FF2EE0204988422A +S3150800598006D18020FFF7A7FF8020FFF7A9FF24E0B4 +S315080059901C49884208D14FF48070FFF79CFF4FF4EA +S315080059A08070FFF79DFF18E01749884208D14FF429 +S315080059B00070FFF790FF4FF40070FFF791FF0CE0BF +S315080059C01249884208D14FF48060FFF784FF4FF4EC +S315080059D08060FFF785FF00E001242000C0B210BDFB +S315080059E0103802400000024000040240000802404D +S315080059F0000C024000100240001402400018024049 +S31508005A00001C0240002002400024024000280240F8 +S31508005A10F8B505000E0000200020306890FAA0F0C6 +S31508005A20B0FA80F734E0726921002800FFF73AFFE0 +S31508005A3028E034680120B8400440002C27D070685C +S31508005A40012802D07068022809D1B268210028000E +S31508005A50FFF7E6FEF26831682800FFF7DBFE3269D9 +S31508005A6021002800FFF7F2FE706802280AD194FA8E +S31508005A70A4F0B0FA80F00828D5D27269210028006F +S31508005A80FFF7FAFE726821002800FFF7ADFE7F1CBB +S31508005A903068F8400028CCD10020F2BD12200880DA +S31508005AA02D487047042008802C48704780B50A00A6 +S31508005AB0C0B2002804D12A492A48FDF7D0F903E0E4 +S31508005AC027492848FDF7CBF9254802BD10B50A0035 +S31508005AD0234C21002448FDF7C2F9200010BD80B5EB +S31508005AE01A20088000F022F8204802BD80B50A0076 +S31508005AF0C0B2002804D11A491D48FDF7B0F903E0E1 +S31508005B0017491B48FDF7ABF9154802BD80B50A00D1 +S31508005B10C0B2002804D112491648FDF7A0F903E0DF +S31508005B200F491448FDF79BF90D4802BD38B51248D0 +S31508005B30006812490C6812490968081800280AD032 +S31508005B400A4D0822A91C00F01DF8042215F11201BD +S31508005B50200000F017F831BD880000209C000020C6 +S31508005B609C0B0020D05E0008F45E0008A000002010 +S31508005B70285F0008B85E000820F4F01F24F4F01F20 +S31508005B8028F4F01F30B4002300231AE00400240F81 +S31508005B9037341D00EDB201F815400AE00400240F61 +S31508005BA00A2CF3D20400240F30341D00EDB201F89C +S31508005BB01540000100241D00EDB201EB45056C708F +S31508005BC05B1C1C001500E4B2EDB2AC42E6D330BC57 +S31508005BD070470000433A5C576F726B5C736F66746C +S31508005BE0776172655C4F70656E424C545C546172A5 +S31508005BF06765745C44656D6F5C41524D434D375F14 +S31508005C0053544D333246375F4E75636C656F5F4646 +S31508005C103734365A475F4941525C426F6F745C7538 +S31508005C207362645F636F6E662E630000008000080F +S31508005C30008000000100000000000108008000004C +S31508005C400200000000800108008000000300000038 +S31508005C50000002080000020004000000000004081A +S31508005C600000040005000000000008080000040009 +S31508005C700600000000000C080000040007000000F1 +S31508005C80433A5C576F726B5C736F667477617265C3 +S31508005C905C4F70656E424C545C5461726765745C07 +S31508005CA044656D6F5C41524D434D375F53544D33D8 +S31508005CB03246375F4E75636C656F5F463734365AC2 +S31508005CC0475F4941525C426F6F745C6D61696E2E25 +S31508005CD063000000433A5C576F726B5C736F6674BF +S31508005CE0776172655C4F70656E424C545C546172A4 +S31508005CF06765745C536F757263655C41524D434DBD +S31508005D00375F53544D333246375C72733233322E13 +S31508005D1063000000433A5C576F726B5C736F66747E +S31508005D20776172655C4F70656E424C545C54617263 +S31508005D306765745C536F757263655C41524D434D7C +S31508005D40375F53544D333246375C63616E2E6300BA +S31508005D50433A5C576F726B5C736F667477617265F2 +S31508005D605C4F70656E424C545C5461726765745C36 +S31508005D70536F757263655C41524D434D375F53549B +S31508005D804D333246375C7573622E630030B5016851 +S31508005D9084684218416802EB5103C90703D54C448D +S31508005DA001E0491C05D19A420AD012F9011B12F8E2 +S31508005DB0015B002904F8015BF3D4491EF7D5F2E725 +S31508005DC00C3030BD10B5074979441831064C7C446F +S31508005DD0163404E00A68081D114488470146A142A2 +S31508005DE0F8D110BD500000006C0000000502060244 +S31508005DF0060307030803090309040A040B040C0431 +S31508005E000C050D050E050F050F06100610071008E0 +S31508005E104EF68851CEF20001086840F4700008601A +S31508005E20BFF34F8FBFF36F8F4FF00070E1EE100A8C +S31508005E30704700003FB3FFFF900F0000C00000202E +S31508005E400000000049FFFFFF940200003001000037 +S31508005E500000002000F00DF8002801D0FFF7B2FF7F +S31508005E60AFF300800020AFF30080FFF73EF900F0A3 +S31508005E7002F80120704700F001B8000007463846CE +S31508005E8000F002F8FBE7000080B5AFF30080024A95 +S31508005E9011001820ABBEFBE7260002000448016883 +S31508005EA051F4700101605FF00060024908607047B4 +S31508005EB088ED00E008ED00E057696E555342204230 +S31508005EC0756C6B20496E74657266616365000000C7 +S31508005ED057696E5553422042756C6B204465766946 +S31508005EE063650000000000000000000001020304D2 +S31508005EF0060708094F70656E424C54205573657243 +S31508005F000000000001488047014800479D5E0008E0 +S31508005F10155F0008AFF30080FFF77AFFFFF79AFFD7 +S31508005F20000000000102030444656661756C740094 +S31508005F304F70656E424C5400FFF7FEBFFFF7FEBF79 S31508005F40FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF77 -S31508005F500010FC000624F4000A060002FD000140B9 -S31508005F6001FD000BB13D0008E13D0008FD3D0008BC -S31508005F70F8000B693E0008733E0008813E0008F4ED -S31508005F800003933E0008FC00129B3E00080902200D -S31508005F9000010100C0320904000002FFFD002D07C0 -S31508005FA00581024000FF070501024000FFCD5800A9 -S31508005FB008D5580008FD580008DD5800080F590094 -S31508005FC0081D5900083D59000812010002FD00127B -S31508005FD040501DAC600002010203010000040309E1 -S30D08005FE0041A03E6000104019E -S70508005D890C +S31508005F50FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF67 +S31508005F60FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF57 +S31508005F70FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF47 +S31508005F80FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF37 +S31508005F90FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF27 +S31508005FA0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF17 +S31508005FB0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF07 +S31508005FC0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF7 +S31508005FD0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFE7 +S31508005FE0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFD7 +S31508005FF0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFC7 +S31508006000FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFB6 +S31508006010FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFA6 +S31508006020FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF96 +S31508006030FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF86 +S31508006040FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF76 +S31508006050FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF66 +S31508006060FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF56 +S31508006070FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF46 +S31508006080FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF36 +S31508006090FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF26 +S315080060A0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF16 +S315080060B0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBF06 +S315080060C0FFF7FEBFFFF7FEBFFFF7FEBFFFF7FEBFF6 +S315080060D0FFF7FEBFFFF7FEBFFFF7FEBF0010FC008D +S315080060E00624F4000A060002FD00014001FD000B2B +S315080060F08D3F0008BD3F0008D93F0008F8000B4552 +S315080061004000084F4000085D400008F400036F4057 +S315080061100008FC001277400008090220000101006F +S31508006120C0320904000002FFFD002D070581024068 +S3150800613000FF070501024000FF9D5A0008A55A0006 +S3150800614008CD5A0008AD5A0008DF5A0008ED5A0073 +S31508006150080D5B000812010002FD001240501DAC3C +S31508006160600002010203010000040309041A03E6A1 +S309080061700001040117 +S70508005F157E diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/ide/stm32f746.dep b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/ide/stm32f746.dep index c9b09f30..35ea17fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/ide/stm32f746.dep +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/ide/stm32f746.dep @@ -6,646 +6,600 @@ stm32f746 $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_compiler.h - $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_iccarm.h $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_version.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_def.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c_ex.h - $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\system_stm32f7xx.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_cortex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal.h - $PROJ_DIR$\..\lib\CMSIS\Include\core_cm7.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_exti.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_can.c - $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h + $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_iccarm.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_can.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_exti.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_def.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma_ex.h + $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\system_stm32f7xx.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_can.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash_ex.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_gpio.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash_ex.h - $PROJ_DIR$\..\lib\CMSIS\Include\mpu_armv7.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio_ex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c_ex.h $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f746xx.h + $PROJ_DIR$\..\lib\CMSIS\Include\core_cm7.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal.h + $PROJ_DIR$\..\lib\CMSIS\Include\mpu_armv7.h + $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_cortex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_exti.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_dma.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_usb.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_bus.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_usart.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_gpio.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.__cstat.et + $TOOLKIT_DIR$\lib\rt7M_tl.a + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.o + $PROJ_DIR$\..\obj\stm32f746.pbd + $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.__cstat.et + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.o + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.pbi + $PROJ_DIR$\..\obj\stm32f7xx_it.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.pbi + $PROJ_DIR$\..\obj\system_stm32f7xx.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.pbi $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pcd.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_exti.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_pwr.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pcd_ex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr_ex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_rcc.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_usart.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_bus.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc_ex.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_system.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_pwr.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_rcc.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usb.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pcd_ex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\rs232.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\timer.c - $PROJ_DIR$\..\startup_stm32f746xx.s - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_core.c - $PROJ_DIR$\..\led.c - $PROJ_DIR$\..\led.h - $PROJ_DIR$\..\main.c - $PROJ_DIR$\..\usbd_conf.c - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_core.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\nvm.c - $PROJ_DIR$\..\lib\stm32f7xx_hal_conf.h - $PROJ_DIR$\..\hooks.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c - $PROJ_DIR$\..\blt_conf.h - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c - $PROJ_DIR$\..\lib\system_stm32f7xx.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_gpio.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_dma.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_usb.h $PROJ_DIR$\..\usbd_bulk.c - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h $PROJ_DIR$\..\usbd_bulk.h - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_def.h - $PROJ_DIR$\..\usbd_conf.h - $PROJ_DIR$\..\usbd_desc.c + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_core.h + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_ctlreq.h + $PROJ_DIR$\..\lib\system_stm32f7xx.c + $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\led.h + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\startup_stm32f746xx.s + $PROJ_DIR$\..\usbd_conf.c $PROJ_DIR$\..\usbd_desc.h $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\IAR\cpu_comp.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\can.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_utils.h + $PROJ_DIR$\..\usbd_conf.h + $PROJ_DIR$\..\usbd_desc.c $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\cpu.c - $PROJ_DIR$\..\..\..\..\Source\net.c - $PROJ_DIR$\..\..\..\..\Source\xcp.c - $PROJ_DIR$\..\..\..\..\Source\file.c - $PROJ_DIR$\..\..\..\..\Source\can.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\types.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\usb.c - $PROJ_DIR$\..\..\..\..\Source\backdoor.h - $PROJ_DIR$\..\..\..\..\Source\cop.h - $PROJ_DIR$\..\..\..\..\Source\timer.h - $PROJ_DIR$\..\..\..\..\Source\assert.h - $PROJ_DIR$\..\..\..\..\Source\boot.h - $PROJ_DIR$\..\..\..\..\Source\rs232.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.o - $PROJ_DIR$\..\..\..\..\Source\cpu.h - $PROJ_DIR$\..\..\..\..\Source\boot.c - $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\nvm.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\rs232.c + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_def.h + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Inc\usbd_ioreq.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\can.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c + $PROJ_DIR$\..\blt_conf.h + $PROJ_DIR$\..\lib\stm32f7xx_hal_conf.h + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_core.c + $PROJ_DIR$\..\led.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_utils.h + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c $PROJ_DIR$\..\..\..\..\Source\nvm.h - $PROJ_DIR$\..\..\..\..\Source\com.c - $PROJ_DIR$\..\..\..\..\Source\plausibility.h - $PROJ_DIR$\..\..\..\..\Source\assert.c - $PROJ_DIR$\..\..\..\..\Source\com.h - $PROJ_DIR$\..\..\..\..\Source\cop.c $PROJ_DIR$\..\..\..\..\Source\xcp.h - $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\timer.h $PROJ_DIR$\..\..\..\..\Source\usb.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.__cstat.et - $PROJ_DIR$\..\bin\demoprog_stm32f746.out - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.o - $PROJ_DIR$\..\obj\main.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.o - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.o - $PROJ_DIR$\..\bin\demoprog_stm32f746.srec - $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_it.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.o - $PROJ_DIR$\..\obj\stm32f7xx_it.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.o + $PROJ_DIR$\..\..\..\..\Source\xcp.c $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.o + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.o + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\net.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\timer.c + $PROJ_DIR$\..\..\..\..\Source\cpu.h + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\..\..\..\Source\rs232.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.o $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.o + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\types.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\usb.c + $PROJ_DIR$\..\..\..\..\Source\can.h + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.o + $PROJ_DIR$\..\obj\main.__cstat.et + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.o + $PROJ_DIR$\..\bin\demoprog_stm32f746.srec + $PROJ_DIR$\..\obj\stm32f7xx_it.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.__cstat.et - $TOOLKIT_DIR$\lib\shb_l.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.o - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.o - $PROJ_DIR$\..\obj\stm32f746.pbd + $PROJ_DIR$\..\bin\demoprog_stm32f746.out + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.o + $PROJ_DIR$\..\obj\stm32f7xx_it.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.o $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.pbi - $TOOLKIT_DIR$\lib\rt7M_tl.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.o - $PROJ_DIR$\..\obj\stm32f7xx_it.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.pbi - $PROJ_DIR$\..\obj\system_stm32f7xx.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.pbi - $PROJ_DIR$\..\lib\CMSIS\Include\core_cmInstr.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.o $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.__cstat.et - $PROJ_DIR$\..\lib\CMSIS\Include\core_cmSimd.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.o $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.o $PROJ_DIR$\..\lib\CMSIS\Include\core_cmFunc.h - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.pbi + $PROJ_DIR$\..\lib\CMSIS\Include\core_cmInstr.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.o $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.pbi $PROJ_DIR$\..\obj\system_stm32f7xx.o $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.o $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.o - $TOOLKIT_DIR$\inc\c\ysizet.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.o - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\uart.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.__cstat.et + $PROJ_DIR$\..\lib\CMSIS\Include\core_cmSimd.h $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.__cstat.et - $TOOLKIT_DIR$\inc\c\stdint.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.pbi - $PROJ_DIR$\..\obj\main.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.__cstat.et - $TOOLKIT_DIR$\inc\c\cmsis_iar.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.o $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.__cstat.et + $TOOLKIT_DIR$\inc\c\cmsis_iar.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.__cstat.et $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.o + $TOOLKIT_DIR$\inc\c\stdint.h $PROJ_DIR$\..\stm32f746xx_flash.icf - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.pbi + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\uart.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.pbi + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.__cstat.et + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.__cstat.et $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.pbi + $TOOLKIT_DIR$\lib\dl7M_tlf.a + $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.pbi - $TOOLKIT_DIR$\inc\c\ycheck.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.__cstat.et - $TOOLKIT_DIR$\lib\dl7M_tlf.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.__cstat.et - $TOOLKIT_DIR$\inc\c\intrinsics.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.__cstat.et - $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.__cstat.et - $TOOLKIT_DIR$\inc\c\stdio.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.__cstat.et - $TOOLKIT_DIR$\inc\c\yvals.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.pbi - $TOOLKIT_DIR$\lib\m7M_tls.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.__cstat.et $TOOLKIT_DIR$\inc\c\ystdio.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.pbi - $PROJ_DIR$\..\obj\assert.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c - $PROJ_DIR$\..\obj\hooks.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c $PROJ_DIR$\..\obj\main.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.__cstat.et - $PROJ_DIR$\..\obj\startup_stm32f746xx.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.xcl - $PROJ_DIR$\..\obj\cpu_comp.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c - $PROJ_DIR$\..\obj\system_stm32f7xx.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.xcl - $TOOLKIT_DIR$\inc\c\iccarm_builtin.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.xcl + $PROJ_DIR$\..\obj\hooks.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.xcl + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.__cstat.et + $TOOLKIT_DIR$\lib\m7M_tls.a + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.o + $TOOLKIT_DIR$\inc\c\stdio.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.pbi + $PROJ_DIR$\..\obj\assert.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.__cstat.et + $PROJ_DIR$\..\stm32f7xx_it.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.o $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.xcl + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\obj\startup_stm32f746xx.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.o $PROJ_DIR$\..\obj\flash.xcl $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.__cstat.et + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.__cstat.et $PROJ_DIR$\..\obj\usbd_ctlreq.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c + $PROJ_DIR$\..\obj\cpu_comp.xcl + $PROJ_DIR$\..\obj\system_stm32f7xx.xcl $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c - $PROJ_DIR$\..\stm32f7xx_it.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c + $TOOLKIT_DIR$\inc\c\string.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c - $PROJ_DIR$\..\main.h - $PROJ_DIR$\..\obj\cop.xcl - $PROJ_DIR$\..\obj\com.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c - $PROJ_DIR$\..\stm32f7xx_hal_msp.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_wwdg.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c - $PROJ_DIR$\..\obj\boot.xcl - $PROJ_DIR$\..\obj\usbd_conf.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.xcl - $PROJ_DIR$\..\obj\file.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + $PROJ_DIR$\..\obj\uart.__cstat.et $PROJ_DIR$\..\stm32f7xx_it.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c $PROJ_DIR$\..\obj\timer.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.o $PROJ_DIR$\..\obj\hooks.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.o $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.__cstat.et + $PROJ_DIR$\..\obj\usbd_conf.o $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c $PROJ_DIR$\..\obj\can.xcl $TOOLKIT_DIR$\inc\c\DLib_Product_string.h - $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c - $PROJ_DIR$\..\obj\timer.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c - $PROJ_DIR$\..\obj\backdoor.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c - $PROJ_DIR$\..\obj\cop.o - $PROJ_DIR$\..\bin\openblt_stm32f746.srec - $TOOLKIT_DIR$\inc\c\ctype.h + $PROJ_DIR$\..\obj\com.xcl + $PROJ_DIR$\..\stm32f7xx_hal_msp.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_wwdg.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c + $PROJ_DIR$\..\main.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c + $PROJ_DIR$\..\obj\cop.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c - $PROJ_DIR$\..\obj\file.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.__cstat.et - $PROJ_DIR$\..\obj\can.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.__cstat.et - $PROJ_DIR$\..\obj\uart.o + $PROJ_DIR$\..\obj\cop.o + $PROJ_DIR$\..\obj\can.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c + $PROJ_DIR$\..\bin\openblt_stm32f746.srec + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c $PROJ_DIR$\..\obj\cpu.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.xcl + $PROJ_DIR$\..\obj\file.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c + $PROJ_DIR$\..\obj\cop.xcl + $PROJ_DIR$\..\obj\boot.xcl + $TOOLKIT_DIR$\inc\c\ctype.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c + $PROJ_DIR$\..\obj\uart.o $PROJ_DIR$\..\obj\stm32f7xx_hal.xcl $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mdios.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.o - $PROJ_DIR$\..\obj\flash.o - $PROJ_DIR$\..\obj\timer.__cstat.et + $PROJ_DIR$\..\obj\backdoor.o + $TOOLKIT_DIR$\inc\c\iar_intrinsics_common.h + $PROJ_DIR$\..\obj\timer.o $PROJ_DIR$\..\obj\cpu_comp.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c + $PROJ_DIR$\..\obj\file.xcl $PROJ_DIR$\..\obj\com.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c $PROJ_DIR$\..\obj\xcp.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.xcl - $PROJ_DIR$\..\obj\file.__cstat.et - $PROJ_DIR$\..\obj\xcp.__cstat.et - $PROJ_DIR$\..\obj\cpu.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c - $PROJ_DIR$\..\obj\led.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c - $PROJ_DIR$\..\obj\net.o - $PROJ_DIR$\..\obj\boot.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c - $PROJ_DIR$\..\obj\boot.o - $PROJ_DIR$\..\obj\backdoor.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c - $PROJ_DIR$\..\obj\openblt_stm32f746.map - $PROJ_DIR$\..\obj\led.o - $PROJ_DIR$\..\obj\assert.__cstat.et - $PROJ_DIR$\..\obj\cpu.__cstat.et - $PROJ_DIR$\..\obj\net.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c - $PROJ_DIR$\..\bin\openblt_stm32f746.out - $PROJ_DIR$\..\obj\can.__cstat.et - $PROJ_DIR$\..\obj\cpu_comp.o - $PROJ_DIR$\..\obj\nvm.__cstat.et - $PROJ_DIR$\..\obj\hooks.__cstat.et - $PROJ_DIR$\..\obj\com.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + $PROJ_DIR$\..\obj\led.xcl $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.xcl $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.xcl - $PROJ_DIR$\..\obj\led.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.xcl - $PROJ_DIR$\..\obj\uart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.xcl - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.__cstat.et - $TOOLKIT_DIR$\inc\c\string.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c + $PROJ_DIR$\..\obj\cpu.o + $PROJ_DIR$\..\obj\net.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.pbi + $PROJ_DIR$\..\obj\net.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + $PROJ_DIR$\..\obj\openblt_stm32f746.map + $PROJ_DIR$\..\bin\openblt_stm32f746.out + $PROJ_DIR$\..\obj\led.o + $PROJ_DIR$\..\obj\can.__cstat.et + $PROJ_DIR$\..\obj\hooks.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c + $PROJ_DIR$\..\obj\com.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.pbi + $PROJ_DIR$\..\obj\boot.__cstat.et + $PROJ_DIR$\..\obj\xcp.__cstat.et + $PROJ_DIR$\..\obj\led.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.pbi + $PROJ_DIR$\..\obj\backdoor.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.xcl + $PROJ_DIR$\..\obj\cpu.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.__cstat.et + $PROJ_DIR$\..\obj\nvm.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.__cstat.et $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc.c - $PROJ_DIR$\..\obj\cop.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c + $PROJ_DIR$\..\obj\boot.o $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c + $PROJ_DIR$\..\obj\cpu_comp.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.xcl $PROJ_DIR$\..\obj\flash.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.o $PROJ_DIR$\..\obj\usb.o $PROJ_DIR$\..\obj\rs232.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.xcl $PROJ_DIR$\..\obj\rs232.xcl - $PROJ_DIR$\..\obj\rs232.__cstat.et + $PROJ_DIR$\..\obj\file.__cstat.et + $PROJ_DIR$\..\obj\assert.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.xcl $PROJ_DIR$\..\obj\usb.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.xcl - $PROJ_DIR$\..\obj\usbd_ctlreq.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.o + $PROJ_DIR$\..\obj\timer.__cstat.et + $PROJ_DIR$\..\obj\usbd_ioreq.__cstat.et + $PROJ_DIR$\..\obj\backdoor.xcl + $PROJ_DIR$\..\obj\uart.xcl $PROJ_DIR$\..\obj\usbd_conf.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c - $PROJ_DIR$\..\obj\xcp.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.__cstat.et - $PROJ_DIR$\..\obj\nvm.xcl - $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h - $PROJ_DIR$\..\obj\usbd_bulk.__cstat.et - $PROJ_DIR$\..\obj\usbd_ctlreq.o - $PROJ_DIR$\..\obj\usbd_ioreq.xcl - $TOOLKIT_DIR$\inc\c\stdlib.h - $TOOLKIT_DIR$\inc\c\stddef.h - $PROJ_DIR$\..\obj\assert.xcl + $PROJ_DIR$\..\obj\usbd_conf.__cstat.et $PROJ_DIR$\..\obj\usbd_desc.o + $PROJ_DIR$\..\obj\usbd_desc.xcl + $PROJ_DIR$\..\obj\net.xcl + $PROJ_DIR$\..\obj\usbd_desc.__cstat.et + $PROJ_DIR$\..\obj\usbd_core.o + $PROJ_DIR$\..\obj\usbd_ctlreq.o + $PROJ_DIR$\..\obj\rs232.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.__cstat.et + $PROJ_DIR$\..\obj\usbd_bulk.__cstat.et + $PROJ_DIR$\..\obj\usb.__cstat.et + $TOOLKIT_DIR$\inc\c\stddef.h + $PROJ_DIR$\..\obj\usbd_ioreq.xcl + $PROJ_DIR$\..\obj\flash.o $PROJ_DIR$\..\obj\usbd_bulk.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\..\obj\assert.xcl + $TOOLKIT_DIR$\inc\c\DLib_Product_stdlib.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c + $PROJ_DIR$\..\obj\usbd_ioreq.o + $PROJ_DIR$\..\obj\usbd_ctlreq.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c $PROJ_DIR$\..\obj\usbd_bulk.xcl $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.xcl - $PROJ_DIR$\..\obj\backdoor.xcl - $PROJ_DIR$\..\obj\usbd_desc.__cstat.et - $PROJ_DIR$\..\obj\uart.xcl - $PROJ_DIR$\..\obj\usbd_core.o - $PROJ_DIR$\..\obj\usbd_conf.__cstat.et - $PROJ_DIR$\..\obj\usbd_ioreq.__cstat.et - $PROJ_DIR$\..\obj\net.xcl - $PROJ_DIR$\..\obj\usbd_desc.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c - $PROJ_DIR$\..\obj\usb.__cstat.et - $PROJ_DIR$\..\obj\usbd_ioreq.o - $PROJ_DIR$\..\obj\usbd_core.xcl $PROJ_DIR$\..\obj\usbd_core.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.__cstat.et + $PROJ_DIR$\..\obj\nvm.xcl + $PROJ_DIR$\..\obj\usbd_core.xcl + $PROJ_DIR$\..\obj\xcp.xcl [ROOT_NODE] ILINK - 497 491 + 482 481 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c ICCARM - 154 + 206 BICOMP - 561 - - - __cstat - 310 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c - - - ICCARM - 465 - - - BICOMP - 526 - - - __cstat - 520 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c - - - ICCARM - 130 - - - BICOMP - 509 + 447 __cstat @@ -655,76 +609,30 @@ ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c ICCARM - 135 + 163 BICOMP - 405 + 524 __cstat - 300 + 349 ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c - - - ICCARM - 160 - - - BICOMP - 430 - - - __cstat - 373 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c - - - ICCARM - 535 - - - BICOMP - 533 - - - __cstat - 549 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 @@ -733,21 +641,21 @@ ICCARM - 438 + 435 BICOMP - 377 + 355 __cstat - 170 + 33 ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 @@ -756,44 +664,21 @@ ICCARM - 153 + 199 BICOMP - 388 + 404 __cstat - 313 + 310 ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c - - - ICCARM - 180 - - - BICOMP - 477 - - - __cstat - 213 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 @@ -802,264 +687,11 @@ ICCARM - 143 + 198 BICOMP - 505 - - - __cstat - 348 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c - - - ICCARM - 299 - - - BICOMP - 466 - - - __cstat - 375 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c - - - ICCARM - 222 - - - BICOMP - 393 - - - __cstat - 242 - - - - - ICCARM - 54 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c - - - ICCARM - 205 - - - BICOMP - 387 - - - __cstat - 384 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c - - - ICCARM - 238 - - - BICOMP - 386 - - - __cstat - 226 - - - - - ICCARM - 46 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 42 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c - - - ICCARM - 218 - - - BICOMP - 506 - - - __cstat - 229 - - - - - ICCARM - 43 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 54 42 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c - - - ICCARM - 275 - - - BICOMP - 396 - - - __cstat - 247 - - - - - ICCARM - 33 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c - - - ICCARM - 203 - - - BICOMP - 503 - - - __cstat - 359 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c - - - ICCARM - 157 - - - BICOMP - 399 - - - __cstat - 312 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c - - - ICCARM - 272 - - - BICOMP - 512 - - - __cstat - 246 - - - - - ICCARM - 36 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 42 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c - - - ICCARM - 211 - - - BICOMP - 534 - - - __cstat - 314 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c - - - ICCARM - 187 - - - BICOMP - 542 + 473 __cstat @@ -1069,7 +701,306 @@ ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c + + + ICCARM + 175 + + + BICOMP + 569 + + + __cstat + 281 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + + + ICCARM + 215 + + + BICOMP + 387 + + + __cstat + 296 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c + + + ICCARM + 534 + + + BICOMP + 512 + + + __cstat + 523 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c + + + ICCARM + 288 + + + BICOMP + 456 + + + __cstat + 343 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c + + + ICCARM + 53 + + + BICOMP + 497 + + + __cstat + 46 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c + + + ICCARM + 515 + + + BICOMP + 432 + + + __cstat + 571 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c + + + ICCARM + 162 + + + BICOMP + 278 + + + __cstat + 344 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c + + + ICCARM + 57 + + + BICOMP + 550 + + + __cstat + 312 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c + + + ICCARM + 268 + + + BICOMP + 532 + + + __cstat + 273 + + + + + ICCARM + 120 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 110 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c + + + ICCARM + 269 + + + BICOMP + 403 + + + __cstat + 218 + + + + + ICCARM + 101 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c + + + ICCARM + 84 + + + BICOMP + 511 + + + __cstat + 362 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c + + + ICCARM + 67 + + + BICOMP + 366 + + + __cstat + 242 + + + + + ICCARM + 107 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c + + + ICCARM + 56 + + + BICOMP + 474 + + + __cstat + 274 + + + + + ICCARM + 109 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 107 110 @@ -1078,67 +1009,21 @@ ICCARM - 255 + 240 BICOMP - 538 + 519 __cstat - 259 + 275 ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c - - - ICCARM - 166 - - - BICOMP - 400 - - - __cstat - 327 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c - - - ICCARM - 338 - - - BICOMP - 378 - - - __cstat - 309 - - - - - ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 @@ -1147,30 +1032,292 @@ ICCARM - 144 + 197 BICOMP - 511 + 503 __cstat - 350 + 348 ICCARM - 15 73 53 5 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\rs232.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c ICCARM - 537 + 76 + + + BICOMP + 371 + + + __cstat + 393 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c + + + ICCARM + 381 + + + BICOMP + 353 + + + __cstat + 282 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c + + + ICCARM + 223 + + + BICOMP + 389 + + + __cstat + 314 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c + + + ICCARM + 191 + + + BICOMP + 357 + + + __cstat + 304 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c + + + ICCARM + 225 + + + BICOMP + 376 + + + __cstat + 241 + + + + + ICCARM + 116 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 110 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c + + + ICCARM + 79 + + + BICOMP + 429 + + + __cstat + 289 + + + + + ICCARM + 23 150 114 6 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\usbd_bulk.c + + + ICCARM + 558 + + + BICOMP + 568 + + + __cstat + 553 + + + + + ICCARM + 126 146 145 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 127 128 136 + + + + + $PROJ_DIR$\..\lib\system_stm32f7xx.c + + + ICCARM + 247 + + + BICOMP + 401 + + + __cstat + 87 + + + + + ICCARM + 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 413 + + + BICOMP + 356 + + + __cstat + 485 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 131 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 116 + + + + + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c + + + ICCARM + 565 + + + BICOMP + 556 + + + __cstat + 536 + + + + + ICCARM + 146 145 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 127 128 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 308 + + + BICOMP + 346 + + + __cstat + 195 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 102 107 110 112 153 109 116 + + + + + $PROJ_DIR$\..\startup_stm32f746xx.s + + + AARM + 380 + + + + + $PROJ_DIR$\..\usbd_conf.c + + + ICCARM + 415 BICOMP @@ -1184,315 +1331,7 @@ ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 43 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\timer.c - - - ICCARM - 447 - - - BICOMP - 435 - - - __cstat - 471 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\startup_stm32f746xx.s - - - AARM - 385 - - - - - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_core.c - - - ICCARM - 565 - - - BICOMP - 573 - - - __cstat - 574 - - - - - ICCARM - 71 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 84 82 77 - - - - - $PROJ_DIR$\..\led.c - - - ICCARM - 492 - - - BICOMP - 507 - - - __cstat - 482 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 68 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 46 - - - - - $PROJ_DIR$\..\main.c - - - ICCARM - 297 - - - BICOMP - 382 - - - __cstat - 129 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 52 54 42 51 91 43 46 - - - - - $PROJ_DIR$\..\usbd_conf.c - - - ICCARM - 429 - - - BICOMP - 544 - - - __cstat - 566 - - - - - ICCARM - 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 84 85 351 555 551 521 444 71 82 77 83 103 97 102 76 112 107 100 110 101 99 109 114 116 118 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\nvm.c - - - ICCARM - 442 - - - BICOMP - 550 - - - __cstat - 500 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 62 - - - - - $PROJ_DIR$\..\hooks.c - - - ICCARM - 439 - - - BICOMP - 380 - - - __cstat - 501 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 68 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 46 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c - - - ICCARM - 132 - - - BICOMP - 404 - - - __cstat - 233 - - - - - ICCARM - 91 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 54 51 52 - - - - - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c - - - ICCARM - 553 - - - BICOMP - 543 - - - __cstat - 408 - - - - - ICCARM - 77 84 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 82 71 - - - - - $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ioreq.c - - - ICCARM - 572 - - - BICOMP - 554 - - - __cstat - 567 - - - - - ICCARM - 82 84 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 71 77 - - - - - $PROJ_DIR$\..\lib\system_stm32f7xx.c - - - ICCARM - 252 - - - BICOMP - 391 - - - __cstat - 200 - - - - - ICCARM - 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\usbd_bulk.c - - - ICCARM - 559 - - - BICOMP - 560 - - - __cstat - 552 - - - - - ICCARM - 83 82 84 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 71 77 87 - - - - - $PROJ_DIR$\..\usbd_desc.c - - - ICCARM - 558 - - - BICOMP - 569 - - - __cstat - 563 - - - - - ICCARM - 71 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 84 82 77 87 + 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 145 138 364 560 562 406 423 127 146 128 126 183 177 180 149 172 171 168 155 157 181 161 166 156 158 @@ -1501,837 +1340,11 @@ ICCARM - 499 + 507 BICOMP - 389 - - - __cstat - 472 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 346 394 354 318 349 131 445 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\can.c - - - ICCARM - 459 - - - BICOMP - 443 - - - __cstat - 498 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 54 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.c - - - ICCARM - 470 - - - BICOMP - 406 - - - __cstat - 532 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\cpu.c - - - ICCARM - 480 - - - BICOMP - 464 - - - __cstat - 494 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 - - - - - $PROJ_DIR$\..\..\..\..\Source\net.c - - - ICCARM - 484 - - - BICOMP - 568 - - - __cstat - 495 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\..\..\..\Source\xcp.c - - - ICCARM - 476 - - - BICOMP - 547 - - - __cstat - 479 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\..\..\..\Source\file.c - - - ICCARM - 457 - - - BICOMP - 431 - - - __cstat - 478 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 521 336 354 318 349 131 267 444 453 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\usb.c - - - ICCARM - 536 - - - BICOMP - 541 - - - __cstat - 571 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 118 71 85 351 336 354 318 349 131 267 555 551 521 444 23 31 16 294 2 0 1 394 30 12 15 73 53 5 8 556 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 84 82 77 87 83 - - - - - $PROJ_DIR$\..\..\..\..\Source\boot.c - - - ICCARM - 487 - - - BICOMP - 428 - - - __cstat - 485 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\..\..\..\Source\com.c - - - ICCARM - 475 - - - BICOMP - 419 - - - __cstat - 502 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 96 104 118 - - - - - $PROJ_DIR$\..\..\..\..\Source\assert.c - - - ICCARM - 370 - - - BICOMP - 557 - - - __cstat - 493 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\..\..\..\Source\cop.c - - - ICCARM - 451 - - - BICOMP - 418 - - - __cstat - 525 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - - - ICCARM - 449 - - - BICOMP - 562 - - - __cstat - 488 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 - - - - - $PROJ_DIR$\..\bin\demoprog_stm32f746.out - - - OBJCOPY - 133 - - - - - ILINK - 317 297 385 299 489 397 438 288 465 469 454 460 468 455 440 150 183 145 180 128 160 151 140 130 153 143 221 119 121 154 135 147 139 179 106 164 158 195 175 173 363 156 190 211 187 205 166 196 157 203 258 169 270 263 250 278 330 265 137 105 172 171 134 144 338 319 274 249 197 269 325 277 272 261 275 334 238 148 227 122 222 264 253 241 136 120 218 255 132 252 163 192 356 344 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c - - - ICCARM - 140 - - - BICOMP - 285 - - - __cstat - 364 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\uart.c - - - ICCARM - 463 - - - BICOMP - 564 - - - __cstat - 510 - - - - - ICCARM - 103 97 102 76 112 107 100 110 101 99 109 114 116 23 31 16 294 336 354 318 349 131 2 0 1 394 30 12 15 73 53 5 8 556 267 50 19 28 3 21 14 13 24 20 29 7 11 59 58 47 41 60 43 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c - - - ICCARM - 185 - - - BICOMP - 279 - - - __cstat - 282 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c - - - ICCARM - 254 - - - BICOMP - 216 - - - __cstat - 284 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c - - - ICCARM - 266 - - - BICOMP - 217 - - - __cstat - 441 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c - - - ICCARM - 151 - - - BICOMP - 372 - - - __cstat - 328 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c - - - ICCARM - 253 - - - BICOMP - 161 - - - __cstat - 245 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c - - - ICCARM - 334 - - - BICOMP - 248 - - - __cstat - 141 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c - - - ICCARM - 128 - - - BICOMP - 368 - - - __cstat - 345 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c - - - ICCARM - 227 - - - BICOMP - 234 - - - __cstat - 124 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c - - - ICCARM - 119 - - - BICOMP - 280 - - - __cstat - 303 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c - - - ICCARM - 277 - - - BICOMP - 220 - - - __cstat - 244 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c - - - ICCARM - 156 - - - BICOMP - 329 - - - __cstat - 291 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c - - - ICCARM - 274 - - - BICOMP - 209 - - - __cstat - 152 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c - - - ICCARM - 179 - - - BICOMP - 260 - - - __cstat - 281 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c - - - ICCARM - 258 - - - BICOMP - 223 - - - __cstat - 324 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\stm32f7xx_it.c - - - ICCARM - 197 - - - BICOMP - 142 - - - __cstat - 146 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 433 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c - - - ICCARM - 105 - - - BICOMP - 199 - - - __cstat - 458 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c - - - ICCARM - 263 - - - BICOMP - 219 - - - __cstat - 401 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c - - - ICCARM - 196 - - - BICOMP - 193 - - - __cstat - 398 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c - - - ICCARM - 171 - - - BICOMP - 214 - - - __cstat - 353 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c - - - ICCARM - 265 - - - BICOMP - 202 - - - __cstat - 286 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c - - - ICCARM - 137 - - - BICOMP - 123 + 400 __cstat @@ -2341,11 +1354,988 @@ ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 183 177 180 149 172 171 168 155 157 181 161 166 156 328 379 358 324 317 196 459 + + + + + $PROJ_DIR$\..\usbd_desc.c + + + ICCARM + 541 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 542 + + + __cstat + 544 + + + + + ICCARM + 127 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 145 146 128 136 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\cpu.c + + + ICCARM + 475 + + + BICOMP + 446 + + + __cstat + 498 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\flash.c + + + ICCARM + 557 + + + BICOMP + 382 + + + __cstat + 513 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\nvm.c + + + ICCARM + 416 + + + BICOMP + 572 + + + __cstat + 500 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 142 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\rs232.c + + + ICCARM + 517 + + + BICOMP + 520 + + + __cstat + 547 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 109 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\can.c + + + ICCARM + 441 + + + BICOMP + 422 + + + __cstat + 484 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 107 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c + + + ICCARM + 186 + + + BICOMP + 378 + + + __cstat + 236 + + + + + ICCARM + 153 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 107 112 102 + + + + + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_core.c + + + ICCARM + 545 + + + BICOMP + 573 + + + __cstat + 570 + + + + + ICCARM + 127 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 145 146 128 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 483 + + + BICOMP + 472 + + + __cstat + 494 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 131 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 116 + + + + + $PROJ_DIR$\..\lib\STM32_USB_Device_Library\Core\Src\usbd_ctlreq.c + + + ICCARM + 546 + + + BICOMP + 566 + + + __cstat + 396 + + + + + ICCARM + 128 145 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 146 127 + + + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + ICCARM + 471 + + + BICOMP + 574 + + + __cstat + 493 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 505 + + + BICOMP + 451 + + + __cstat + 492 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 458 + + + BICOMP + 537 + + + __cstat + 496 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 369 + + + BICOMP + 561 + + + __cstat + 522 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + ICCARM + 476 + + + BICOMP + 543 + + + __cstat + 479 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\timer.c + + + ICCARM + 460 + + + BICOMP + 410 + + + __cstat + 535 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\usb.c + + + ICCARM + 516 + + + BICOMP + 533 + + + __cstat + 554 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 158 127 138 364 386 358 324 317 196 306 560 562 406 423 25 21 22 294 1 0 2 379 24 8 23 150 114 6 26 555 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 145 146 128 136 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 463 + + + BICOMP + 424 + + + __cstat + 488 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 179 173 158 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 440 + + + BICOMP + 450 + + + __cstat + 437 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 448 + + + BICOMP + 462 + + + __cstat + 521 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 406 386 358 324 317 196 306 423 452 + + + + + $PROJ_DIR$\..\bin\demoprog_stm32f746.out + + + OBJCOPY + 201 + + + + + ILINK + 295 308 380 288 477 377 435 293 534 551 438 559 444 465 420 190 224 192 53 91 206 160 162 163 199 198 72 66 209 175 215 213 216 222 82 49 211 65 34 244 363 194 63 79 57 76 223 81 191 84 267 61 280 260 243 272 340 266 212 68 50 45 210 197 381 326 270 237 78 311 320 254 268 277 269 337 225 187 245 193 67 279 248 229 200 85 56 240 186 247 62 43 360 316 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c + + + ICCARM + 160 + + + BICOMP + 370 + + + __cstat + 329 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c + + + ICCARM + 249 + + + BICOMP + 86 + + + __cstat + 414 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM7_STM32F7\uart.c + + + ICCARM + 455 + + + BICOMP + 538 + + + __cstat + 408 + + + + + ICCARM + 183 177 180 149 172 171 168 155 157 181 161 166 156 25 21 22 294 386 358 324 317 196 1 0 2 379 24 8 23 150 114 6 26 555 306 111 5 15 16 28 7 27 3 10 13 18 20 98 104 96 124 103 109 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c + + + ICCARM + 227 + + + BICOMP + 47 + + + __cstat + 262 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c + + + ICCARM + 217 + + + BICOMP + 253 + + + __cstat + 251 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c + + + ICCARM + 222 + + + BICOMP + 302 + + + __cstat + 256 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c + + + ICCARM + 267 + + + BICOMP + 83 + + + __cstat + 331 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c + + + ICCARM + 337 + + + BICOMP + 232 + + + __cstat + 188 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c + + + ICCARM + 66 + + + BICOMP + 276 + + + __cstat + 301 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\stm32f7xx_it.c + + + ICCARM + 78 + + + BICOMP + 202 + + + __cstat + 214 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 409 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c + + + ICCARM + 270 + + + BICOMP + 70 + + + __cstat + 203 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c + + + ICCARM + 91 + + + BICOMP + 478 + + + __cstat + 322 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c + + + ICCARM + 194 + + + BICOMP + 339 + + + __cstat + 291 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c + + + ICCARM + 245 + + + BICOMP + 231 + + + __cstat + 75 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c + + + ICCARM + 254 + + + BICOMP + 92 + + + __cstat + 234 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c + + + ICCARM + 260 + + + BICOMP + 69 + + + __cstat + 397 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c + + + ICCARM + 45 + + + BICOMP + 95 + + + __cstat + 499 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c + + + ICCARM + 200 + + + BICOMP + 40 + + + __cstat + 228 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c + + + ICCARM + 68 + + + BICOMP + 93 + + + __cstat + 466 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c + + + ICCARM + 192 + + + BICOMP + 491 + + + __cstat + 390 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c + + + ICCARM + 277 + + + BICOMP + 37 + + + __cstat + 208 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c + + + ICCARM + 212 + + + BICOMP + 205 + + + __cstat + 552 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 @@ -2358,84 +2348,17 @@ BICOMP - 149 + 204 __cstat - 155 + 176 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c - - - ICCARM - 269 - - - BICOMP - 127 - - - __cstat - 186 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c - - - ICCARM - 278 - - - BICOMP - 212 - - - __cstat - 305 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c - - - ICCARM - 106 - - - BICOMP - 257 - - - __cstat - 321 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 @@ -2444,65 +2367,155 @@ ICCARM - 249 + 237 BICOMP - 215 + 64 __cstat - 165 + 221 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c ICCARM - 134 + 272 BICOMP - 232 + 89 __cstat - 462 + 299 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c ICCARM - 158 + 81 BICOMP - 251 + 38 + + + __cstat + 385 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c + + + ICCARM + 266 + + + BICOMP + 77 + + + __cstat + 263 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c + + + ICCARM + 465 + + + BICOMP + 398 + + + __cstat + 486 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c + + + ICCARM + 279 + + + BICOMP + 238 + + + __cstat + 257 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c + + + ICCARM + 49 + + + BICOMP + 252 __cstat @@ -2512,81 +2525,34 @@ ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c ICCARM + 210 + + + BICOMP 264 - - BICOMP - 176 - __cstat - 237 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c - - - ICCARM - 136 - - - BICOMP - 181 - - - __cstat - 230 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c - - - ICCARM - 261 - - - BICOMP - 177 - - - __cstat - 126 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c - - - ICCARM - 150 - - - BICOMP - 371 - - - __cstat - 360 + 439 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 @@ -2595,48 +2561,71 @@ ICCARM - 250 + 243 BICOMP - 225 + 219 __cstat - 283 + 265 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c ICCARM - 121 + 72 BICOMP - 320 + 315 __cstat - 289 + 333 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + + + ICCARM + 211 + + + BICOMP + 246 + + + __cstat + 319 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 @@ -2645,21 +2634,21 @@ ICCARM - 159 + 189 BICOMP - 208 + 88 __cstat - 298 + 335 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 @@ -2668,11 +2657,131 @@ ICCARM - 175 + 34 BICOMP - 256 + 261 + + + __cstat + 372 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c + + + ICCARM + 82 + + + BICOMP + 258 + + + __cstat + 388 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c + + + ICCARM + 311 + + + BICOMP + 94 + + + __cstat + 42 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c + + + ICCARM + 193 + + + BICOMP + 39 + + + __cstat + 259 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + + + ICCARM + 209 + + + BICOMP + 338 + + + __cstat + 297 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c + + + ICCARM + 248 + + + BICOMP + 54 + + + __cstat + 235 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + + + ICCARM + 63 + + + BICOMP + 58 __cstat @@ -2682,162 +2791,7 @@ ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c - - - ICCARM - 122 - - - BICOMP - 174 - - - __cstat - 273 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c - - - ICCARM - 221 - - - BICOMP - 326 - - - __cstat - 311 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c - - - ICCARM - 288 - - - BICOMP - 335 - - - __cstat - 410 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c - - - ICCARM - 460 - - - BICOMP - 357 - - - __cstat - 366 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c - - - ICCARM - 469 - - - BICOMP - 210 - - - __cstat - 343 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c - - - ICCARM - 147 - - - BICOMP - 333 - - - __cstat - 295 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c - - - ICCARM - 397 - - - BICOMP - 369 - - - __cstat - 194 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 @@ -2846,391 +2800,54 @@ ILINK - 491 + 481 OBJCOPY - 452 + 443 ILINK - 317 370 449 487 459 475 451 480 499 457 470 439 492 297 484 442 537 385 299 438 465 180 160 535 130 153 143 154 135 211 187 205 166 157 203 144 338 272 275 238 222 218 255 132 252 447 536 559 429 565 553 558 572 476 163 192 356 344 + 295 369 458 505 441 463 440 475 507 448 557 413 483 308 476 416 517 380 288 435 534 53 206 515 163 199 198 175 215 79 57 76 223 191 84 197 381 268 269 225 67 56 240 186 247 460 516 558 415 545 546 541 565 471 62 43 360 316 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c ICCARM - 190 + 213 BICOMP - 182 + 327 __cstat - 361 + 307 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c ICCARM - 139 - - - BICOMP - 296 - - - __cstat - 302 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c - - - ICCARM - 164 - - - BICOMP - 276 - - - __cstat - 337 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c - - - ICCARM - 183 - - - BICOMP - 331 - - - __cstat - 188 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c - - - ICCARM - 270 - - - BICOMP - 243 - - - __cstat - 292 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c - - - ICCARM - 145 - - - BICOMP - 355 - - - __cstat - 332 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c - - - ICCARM - 120 - - - BICOMP - 189 - - - __cstat - 240 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c - - - ICCARM - 173 - - - BICOMP - 268 - - - __cstat - 347 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c - - - ICCARM - 169 - - - BICOMP - 201 - - - __cstat 293 - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c - - - ICCARM - 440 - BICOMP 323 - - __cstat - 362 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c - - - ICCARM - 455 - - - BICOMP - 340 - - - __cstat - 352 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc.c - - - ICCARM - 489 - - - BICOMP - 191 - - - __cstat - 204 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c - - - ICCARM - 172 - - - BICOMP - 206 - - - __cstat - 290 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c - - - ICCARM - 148 - - - BICOMP - 236 - - - __cstat - 138 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c - - - ICCARM - 195 - - - BICOMP - 262 - - - __cstat - 403 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c - - - ICCARM - 454 - - - BICOMP - 315 - - - __cstat - 358 - - - - - ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c - - - ICCARM - 468 - - - BICOMP - 339 - __cstat 402 @@ -3239,64 +2856,112 @@ ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c ICCARM - 325 + 551 BICOMP - 198 + 74 __cstat - 162 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c - - - ICCARM - 241 - - - BICOMP - 178 - - - __cstat - 235 + 330 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 - - - BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc.c ICCARM - 319 + 477 BICOMP - 207 + 36 + + + __cstat + 35 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c + + + ICCARM + 377 + + + BICOMP + 365 + + + __cstat + 80 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c + + + ICCARM + 438 + + + BICOMP + 283 + + + __cstat + 373 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c + + + ICCARM + 61 + + + BICOMP + 41 __cstat @@ -3306,11 +2971,279 @@ ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c + + + ICCARM + 85 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 44 + + + __cstat + 239 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + + + ICCARM + 65 + + + BICOMP + 305 + + + __cstat + 395 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c + + + ICCARM + 187 + + + BICOMP + 255 + + + __cstat + 174 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c + + + ICCARM + 224 + + + BICOMP + 394 + + + __cstat + 48 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c + + + ICCARM + 216 + + + BICOMP + 334 + + + __cstat + 321 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c + + + ICCARM + 50 + + + BICOMP + 71 + + + __cstat + 284 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c + + + ICCARM + 420 + + + BICOMP + 384 + + + __cstat + 359 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c + + + ICCARM + 244 + + + BICOMP + 292 + + + __cstat + 325 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c + + + ICCARM + 444 + + + BICOMP + 332 + + + __cstat + 351 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c + + + ICCARM + 280 + + + BICOMP + 271 + + + __cstat + 298 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c + + + ICCARM + 559 + + + BICOMP + 368 + + + __cstat + 354 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c + + + ICCARM + 229 + + + BICOMP + 52 + + + __cstat + 233 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 @@ -3319,34 +3252,101 @@ ICCARM - 330 + 340 BICOMP - 228 + 220 __cstat - 304 + 285 ICCARM - 15 73 417 53 5 23 31 16 294 336 354 318 349 131 167 322 224 306 346 239 231 12 8 351 267 365 50 28 3 21 14 13 20 29 7 11 59 58 + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 BICOMP - 50 354 5 336 351 294 167 23 15 16 231 14 11 73 417 53 28 21 13 20 7 59 8 31 12 224 318 322 346 306 365 29 239 349 131 267 3 58 + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + + + ICCARM + 320 + + + BICOMP + 90 + + + __cstat + 59 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c + + + ICCARM + 190 + + + BICOMP + 495 + + + __cstat + 501 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c + + + ICCARM + 326 + + + BICOMP + 73 + + + __cstat + 309 + + + + + ICCARM + 23 150 428 114 6 25 21 22 294 386 358 324 317 196 60 313 230 286 328 226 250 8 26 364 306 345 111 15 16 28 7 27 10 13 18 20 98 104 + + + BICOMP + 111 358 6 386 364 294 60 25 23 22 250 7 20 150 428 114 15 28 27 10 18 98 26 21 8 230 324 313 328 286 345 13 226 317 196 306 16 104 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c ICCARM - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c ICCARM diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h index 5de6c6e1..2c47d3f0 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h @@ -12,29 +12,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h index 0633bb22..2650b739 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h @@ -96,16 +96,16 @@ typedef struct __PCD_HandleTypeDef typedef struct #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ { - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ uint32_t BESL; @@ -148,9 +148,9 @@ typedef struct /** @defgroup PCD_Speed PCD Speed * @{ */ -#define PCD_SPEED_HIGH 0U -#define PCD_SPEED_HIGH_IN_FULL 1U -#define PCD_SPEED_FULL 2U +#define PCD_SPEED_HIGH USBD_HS_SPEED +#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED +#define PCD_SPEED_FULL USBD_FS_SPEED /** * @} */ @@ -207,20 +207,20 @@ typedef struct #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ } while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ } while(0U) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -256,7 +256,7 @@ typedef enum HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ @@ -371,14 +371,6 @@ PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); * @{ */ #if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - #define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ #define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h index f151a3d3..9bbccb71 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h @@ -42,13 +42,6 @@ extern "C" { /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_LL_Private_Constants USART Private Constants - * @{ - */ -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ #if defined(USE_FULL_LL_DRIVER) /** @defgroup USART_LL_Private_Macros USART Private Macros @@ -156,18 +149,21 @@ typedef struct */ #define LL_USART_ICR_PECF USART_ICR_PECF /*!< Parity error flag */ #define LL_USART_ICR_FECF USART_ICR_FECF /*!< Framing error flag */ -#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ +#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ #define LL_USART_ICR_ORECF USART_ICR_ORECF /*!< Overrun error flag */ #define LL_USART_ICR_IDLECF USART_ICR_IDLECF /*!< Idle line detected flag */ #define LL_USART_ICR_TCCF USART_ICR_TCCF /*!< Transmission complete flag */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ICR_TCBGTCF USART_ICR_TCBGTCF /*!< Transmission completed before guard time flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ #define LL_USART_ICR_LBDCF USART_ICR_LBDCF /*!< LIN break detection flag */ #define LL_USART_ICR_CTSCF USART_ICR_CTSCF /*!< CTS flag */ #define LL_USART_ICR_RTOCF USART_ICR_RTOCF /*!< Receiver timeout flag */ #define LL_USART_ICR_EOBCF USART_ICR_EOBCF /*!< End of block flag */ #define LL_USART_ICR_CMCF USART_ICR_CMCF /*!< Character match flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ICR_WUCF USART_ICR_WUCF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ /** * @} */ @@ -195,10 +191,16 @@ typedef struct #define LL_USART_ISR_CMF USART_ISR_CMF /*!< Character match flag */ #define LL_USART_ISR_SBKF USART_ISR_SBKF /*!< Send break flag */ #define LL_USART_ISR_RWU USART_ISR_RWU /*!< Receiver wakeup from Mute mode flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ISR_WUF USART_ISR_WUF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ #define LL_USART_ISR_TEACK USART_ISR_TEACK /*!< Transmit enable acknowledge flag */ +#if defined(USART_ISR_REACK) +#define LL_USART_ISR_REACK USART_ISR_REACK /*!< Receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ISR_TCBGT USART_ISR_TCBGT /*!< Transmission complete before guard time completion flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -218,9 +220,12 @@ typedef struct #define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ #define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ #define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +#if defined(USART_CR1_UESM) +#define LL_USART_CR3_WUFIE USART_CR3_WUFIE /*!< Wakeup from Stop mode interrupt enable */ +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_CR3_TCBGTIE USART_CR3_TCBGTIE /*!< Transmission complete before guard time interrupt enable */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -400,6 +405,18 @@ typedef struct * @} */ +#if defined(USART_CR1_UESM) +/** @defgroup USART_LL_EC_WAKEUP_ON Wakeup Activation + * @{ + */ +#define LL_USART_WAKEUP_ON_ADDRESS 0x00000000U /*!< Wake up active on address match */ +#define LL_USART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< Wake up active on Start bit detection */ +#define LL_USART_WAKEUP_ON_RXNE (USART_CR3_WUS_0 | USART_CR3_WUS_1) /*!< Wake up active on RXNE */ +/** + * @} + */ + +#endif /* USART_CR1_UESM */ /** @defgroup USART_LL_EC_IRDA_POWER IrDA Power * @{ */ @@ -480,7 +497,8 @@ typedef struct * @param __BAUDRATE__ Baud rate value to achieve * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case */ -#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U) + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U)\ + + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) /** * @brief Compute USARTDIV value according to Peripheral Clock and @@ -545,6 +563,87 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief USART enabled in STOP Mode. + * @note When this function is enabled, USART is able to wake up the MCU from Stop mode, provided that + * USART clock selection is HSI or LSE in RCC. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_EnableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief USART disabled in STOP Mode. + * @note When this function is disabled, USART is not able to wake up the MCU from Stop mode + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_DisableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief Indicate if USART is enabled in STOP Mode (able to wake up MCU from Stop mode or not) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_IsEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledInStopMode(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR1, USART_CR1_UESM) == (USART_CR1_UESM)) ? 1UL : 0UL); +} + +#if defined(USART_CR3_UCESM) +/** + * @brief USART Clock enabled in STOP Mode + * @note When this function is called, USART Clock is enabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_EnableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableClockInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief USART clock disabled in STOP Mode + * @note When this function is called, USART Clock is disabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_DisableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableClockInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief Indicate if USART clock is enabled in STOP Mode + * @rmtoll CR3 UCESM LL_USART_IsClockEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsClockEnabledInStopMode(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_UCESM) == (USART_CR3_UCESM)); +} + +#endif /* USART_CR3_UCESM */ +#endif /* USART_CR1_UESM*/ /** * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) * @rmtoll CR1 RE LL_USART_EnableDirectionRx @@ -1461,6 +1560,41 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_OVRDIS) != USART_CR3_OVRDIS) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Select event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_SetWKUPType + * @param USARTx USART Instance + * @param Type This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWKUPType(USART_TypeDef *USARTx, uint32_t Type) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_WUS, Type); +} + +/** + * @brief Return event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_GetWKUPType + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + */ +__STATIC_INLINE uint32_t LL_USART_GetWKUPType(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_WUS)); +} + +#endif /* USART_CR1_UESM */ /** * @brief Configure USART BRR register for achieving expected Baud Rate value. * @note Compute and set USARTDIV value in BRR Register (full BRR content) @@ -1480,7 +1614,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) __STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate) { - register uint32_t usartdiv; + uint32_t usartdiv; register uint32_t brrtemp; if (OverSampling == LL_USART_OVERSAMPLING_8) @@ -2161,7 +2295,8 @@ __STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) { /* In Asynchronous mode, the following bits must be kept cleared: - LINEN, CLKEN bits in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); } @@ -2197,7 +2332,8 @@ __STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) { /* In Synchronous mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); /* set the UART/USART in Synchronous mode */ @@ -2237,7 +2373,8 @@ __STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) { /* In LIN mode, the following bits must be kept cleared: - STOP and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); /* Set the UART/USART in LIN mode */ @@ -2275,7 +2412,8 @@ __STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) { /* In Half Duplex mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ + - SCEN and IREN bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); /* set the UART/USART in Half Duplex mode */ @@ -2315,7 +2453,8 @@ __STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) { /* In Smartcard mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - IREN and HDSEL bits in the USART_CR3 register.*/ + - IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); /* Configure Stop bits to 1.5 bits */ @@ -2358,7 +2497,8 @@ __STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) { /* In IRDA mode, the following bits must be kept cleared: - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ + - SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); /* set the UART/USART in IRDA mode */ @@ -2396,7 +2536,8 @@ __STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) { /* In Multi Processor mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); } @@ -2630,6 +2771,21 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_RWU) == (USART_ISR_RWU)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from stop mode Flag is set or not + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ISR WUF LL_USART_IsActiveFlag_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_WUF) == (USART_ISR_WUF)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ /** * @brief Check if the USART Transmit Enable Acknowledge Flag is set or not * @rmtoll ISR TEACK LL_USART_IsActiveFlag_TEACK @@ -2641,6 +2797,19 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TEACK(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_TEACK) == (USART_ISR_TEACK)) ? 1UL : 0UL); } +#if defined(USART_ISR_REACK) +/** + * @brief Check if the USART Receive Enable Acknowledge Flag is set or not + * @rmtoll ISR REACK LL_USART_IsActiveFlag_REACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_REACK(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_REACK) == (USART_ISR_REACK)) ? 1UL : 0UL); +} + +#endif/* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2653,8 +2822,8 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->ISR, USART_ISR_TCBGT) == (USART_ISR_TCBGT)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear Parity Error Flag * @rmtoll ICR PECF LL_USART_ClearFlag_PE @@ -2733,7 +2902,7 @@ __STATIC_INLINE void LL_USART_ClearFlag_TCBGT(USART_TypeDef *USARTx) { WRITE_REG(USARTx->ICR, USART_ICR_TCBGTCF); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear LIN Break Detection Flag @@ -2796,6 +2965,21 @@ __STATIC_INLINE void LL_USART_ClearFlag_CM(USART_TypeDef *USARTx) WRITE_REG(USARTx->ICR, USART_ICR_CMCF); } +#if defined(USART_CR1_UESM) +/** + * @brief Clear Wake Up from stop mode Flag + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ICR WUCF LL_USART_ClearFlag_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_WKUP(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->ICR, USART_ICR_WUCF); +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2935,6 +3119,21 @@ __STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) SET_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Enable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_EnableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_WKUP(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2949,7 +3148,7 @@ __STATIC_INLINE void LL_USART_EnableIT_TCBGT(USART_TypeDef *USARTx) { SET_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Disable IDLE Interrupt @@ -3082,6 +3281,21 @@ __STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Disable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_DisableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_WKUP(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3096,7 +3310,7 @@ __STATIC_INLINE void LL_USART_DisableIT_TCBGT(USART_TypeDef *USARTx) { CLEAR_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Check if the USART IDLE Interrupt source is enabled or disabled. @@ -3225,6 +3439,21 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from Stop Mode Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_IsEnabledIT_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR3, USART_CR3_WUFIE) == (USART_CR3_WUFIE)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3239,7 +3468,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->CR3, USART_CR3_TCBGTIE) == (USART_CR3_TCBGTIE)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} @@ -3365,12 +3594,12 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t if (Direction == LL_USART_DMA_REG_DATA_TRANSMIT) { /* return address of TDR register */ - data_reg_addr = (uint32_t) & (USARTx->TDR); + data_reg_addr = (uint32_t) &(USARTx->TDR); } else { /* return address of RDR register */ - data_reg_addr = (uint32_t) & (USARTx->RDR); + data_reg_addr = (uint32_t) &(USARTx->RDR); } return data_reg_addr; @@ -3392,7 +3621,7 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t */ __STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) { - return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR)); + return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR) & 0xFFU); } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h index 1f768abf..44bf4853 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h @@ -155,7 +155,7 @@ typedef struct typedef struct { - uint8_t dev_addr ; /*!< USB device address. + uint8_t dev_addr; /*!< USB device address. This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ uint8_t ch_num; /*!< Host channel number. @@ -199,10 +199,10 @@ typedef struct uint32_t ErrCnt; /*!< Host channel error count.*/ - USB_OTG_URBStateTypeDef urb_state; /*!< URB state. + USB_OTG_URBStateTypeDef urb_state; /*!< URB state. This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ - USB_OTG_HCStateTypeDef state; /*!< Host Channel state. + USB_OTG_HCStateTypeDef state; /*!< Host Channel state. This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ } USB_OTG_HCTypeDef; #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -234,6 +234,18 @@ typedef struct * @} */ +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_HS_SPEED 0U +#define USBD_HSINFS_SPEED 1U +#define USBH_HS_SPEED 0U +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + /** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed * @{ */ @@ -252,7 +264,7 @@ typedef struct #define USB_OTG_HS_EMBEDDED_PHY 3U #if !defined (USB_HS_PHYC_TUNE_VALUE) -#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ +#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ #endif /* USB_HS_PHYC_TUNE_VALUE */ /** * @} @@ -262,11 +274,11 @@ typedef struct * @{ */ #ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U +#define USBD_HS_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ #ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ /** * @} @@ -275,9 +287,9 @@ typedef struct /** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS * @{ */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U +#define USB_OTG_HS_MAX_PACKET_SIZE 512U +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U /** * @} */ @@ -287,7 +299,6 @@ typedef struct */ #define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) #define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_LS_PHY_6MHZ (2U << 1) #define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) /** * @} @@ -397,7 +408,7 @@ typedef struct #define USBPHYC ((USBPHYC_GlobalTypeDef *)((uint32_t )USB_PHY_HS_CONTROLLER_BASE)) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#define EP_ADDR_MSK 0xFU +#define EP_ADDR_MSK 0xFU /** * @} */ @@ -462,13 +473,9 @@ HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state); uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx); uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c index 2b4a5eff..ea532df6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c @@ -122,6 +122,7 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint */ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) { + USB_OTG_GlobalTypeDef *USBx; uint8_t i; /* Check the PCD handle allocation */ @@ -133,6 +134,8 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) /* Check the parameters */ assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + USBx = hpcd->Instance; + if (hpcd->State == HAL_PCD_STATE_RESET) { /* Allocate lock resource and initialize it */ @@ -166,6 +169,12 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) hpcd->State = HAL_PCD_STATE_BUSY; + /* Disable DMA mode for FS instance */ + if ((USBx->CID & (0x1U << 8)) == 0U) + { + hpcd->Init.dma_enable = 0U; + } + /* Disable the Interrupts */ __HAL_PCD_DISABLE(hpcd); @@ -943,7 +952,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i, ep_intr, epint, epnum = 0U; + uint32_t i, ep_intr, epint, epnum; uint32_t fifoemptymsk, temp; USB_OTG_EPTypeDef *ep; @@ -962,6 +971,38 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); } + /* Handle RxQLevel Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + temp = USBx->GRXSTSP; + + ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(USBx, ep->xfer_buff, + (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + else + { + /* ... */ + } + USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) { epnum = 0U; @@ -983,9 +1024,9 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); /* Class B setup phase done for previous decoded setup */ (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) @@ -996,10 +1037,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Clear Status Phase Received interrupt */ if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) { - if (hpcd->Init.dma_enable == 1U) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); } @@ -1037,16 +1074,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if (hpcd->Init.dma_enable == 1U) { hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - } -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if (hpcd->Init.dma_enable == 1U) - { /* this is ZLP, so prepare EP0 for next setup */ if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) { @@ -1054,6 +1082,12 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) { @@ -1159,8 +1193,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USBx_INEP(i)->DIEPINT = 0xFB7FU; USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_INEP(i)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; USBx_OUTEP(i)->DOEPINT = 0xFB7FU; USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; } USBx_DEVICE->DAINTMSK |= 0x10001U; @@ -1217,38 +1253,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); } - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - temp = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; - - if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - /* Handle SOF Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) { @@ -1264,6 +1268,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO IN Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) { + /* Keep application checking the corresponding Iso IN endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1276,6 +1284,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO OUT Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) { + /* Keep application checking the corresponding Iso OUT endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1955,16 +1967,6 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint { CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ { @@ -1987,17 +1989,16 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket; -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) { /* this is ZLP, so prepare EP0 for next setup */ (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } } else @@ -2030,6 +2031,12 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint } else { + if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) + { + /* this is ZLP, so prepare EP0 for next setup */ + (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); + } + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); #else @@ -2055,22 +2062,10 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U); uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - if (hpcd->Init.dma_enable == 1U) + if ((gSNPSiD > USB_OTG_CORE_ID_300A) && + ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) { - /* StupPktRcvd = 1 pending setup packet int */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else - { - if ((gSNPSiD == USB_OTG_CORE_ID_310A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } /* Inform the upper layer that a setup packet is available */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c index 987e5bef..0f04752c 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c @@ -220,9 +220,6 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru if (currentpin) { - /* Pin Mode configuration */ - LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) { /* Check Speed mode parameters */ @@ -230,6 +227,12 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru /* Speed mode configuration */ LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); } /* Pull-up Pull down resistor configuration*/ @@ -250,19 +253,11 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); } } + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); } pinpos++; } - - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) - { - /* Check Output mode parameters */ - assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); - - /* Output mode configuration*/ - LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); - - } return (SUCCESS); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c index 0197818f..588d0bb5 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c @@ -163,7 +163,7 @@ uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void); */ ErrorStatus LL_RCC_DeInit(void) { - uint32_t vl_mask = 0xFFFFFFFFU; + __IO uint32_t vl_mask; /* Set HSION bit */ LL_RCC_HSI_Enable(); @@ -175,10 +175,13 @@ ErrorStatus LL_RCC_DeInit(void) /* Reset CFGR register */ LL_RCC_WriteReg(CFGR, 0x00000000U); + /* Read CR register */ + vl_mask = LL_RCC_ReadReg(CR); + /* Reset HSEON, HSEBYP, PLLON, CSSON, PLLI2SON and PLLSAION bits */ CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_PLLSAION | RCC_CR_PLLI2SON)); - /* Write new mask in CR register */ + /* Write new value in CR register */ LL_RCC_WriteReg(CR, vl_mask); /* Set HSITRIM bits to the reset value*/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c index 2f82ef49..b3db0e6a 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c @@ -22,11 +22,11 @@ #include "stm32f7xx_ll_usart.h" #include "stm32f7xx_ll_rcc.h" #include "stm32f7xx_ll_bus.h" -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else #define assert_param(expr) ((void)0U) -#endif +#endif /* USE_FULL_ASSERT */ /** @addtogroup STM32F7xx_LL_Driver * @{ @@ -41,14 +41,6 @@ /* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @addtogroup USART_LL_Private_Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ /** @addtogroup USART_LL_Private_Macros * @{ @@ -65,42 +57,42 @@ #define IS_LL_USART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ - || ((__VALUE__) == LL_USART_DIRECTION_RX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ - || ((__VALUE__) == LL_USART_PARITY_EVEN) \ - || ((__VALUE__) == LL_USART_PARITY_ODD)) + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ - || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ - || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ - || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ - || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ - || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_1) \ - || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_2)) + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c index ece23086..8d9dbb24 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c @@ -94,6 +94,11 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c /* Init The ULPI Interface */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + /* Select ULPI Interface */ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; +#endif /* defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) */ + /* Select vbus source */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); if (cfg.use_external_vbus == 1U) @@ -115,7 +120,7 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); /* Select UTMI Interace */ - USBx->GUSBCFG &= ~ USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; USBx->GCCFG |= USB_OTG_GCCFG_PHYHSEN; /* Enables control of a High Speed USB PHY */ @@ -158,10 +163,6 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c * @brief Set the USB turnaround time * @param USBx USB Instance * @param hclk: AHB clock frequency - * @param speed device speed - * This parameter can be one of these values: - * @arg PCD_SPEED_HIGH: High speed mode - * @arg PCD_SPEED_FULL: Full speed mode * @retval USB turnaround time In PHY Clocks number */ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, @@ -173,7 +174,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, used by application. In the low AHB frequency range it is used to stretch enough the USB response time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access latency to the Data FIFO */ - if (speed == PCD_SPEED_FULL) + if (speed == USBD_FS_SPEED) { if ((hclk >= 14200000U) && (hclk < 15000000U)) { @@ -226,7 +227,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, UsbTrd = 0x6U; } } - else if (speed == PCD_SPEED_HIGH) + else if (speed == USBD_HS_SPEED) { UsbTrd = USBD_HS_TRDT_VALUE; } @@ -318,6 +319,8 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf /* VBUS Sensing setup */ if (cfg.vbus_sensing_enable == 0U) { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + /* Deactivate VBUS Sensing B */ USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; @@ -339,33 +342,33 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf if (cfg.phy_itface == USB_OTG_ULPI_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else { - /* Set Full speed phy */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); } @@ -431,17 +434,6 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - if (cfg.dma_enable == 1U) - { - /*Set threshold parameters */ - USBx_DEVICE->DTHRCTL = USB_OTG_DTHRCTL_TXTHRLEN_6 | - USB_OTG_DTHRCTL_RXTHRLEN_6; - - USBx_DEVICE->DTHRCTL |= USB_OTG_DTHRCTL_RXTHREN | - USB_OTG_DTHRCTL_ISOTHREN | - USB_OTG_DTHRCTL_NONISOTHREN; - } - /* Disable all interrupts. */ USBx->GINTMSK = 0U; @@ -557,16 +549,16 @@ uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { - speed = PCD_SPEED_HIGH; + speed = USBD_HS_SPEED; } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { - speed = PCD_SPEED_FULL; + speed = USBD_FS_SPEED; } else { - speed = 0U; + speed = 0xFU; } return speed; @@ -663,6 +655,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | @@ -673,6 +671,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | @@ -698,11 +702,23 @@ HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, U /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); } @@ -761,9 +777,27 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + if (ep->type != EP_TYPE_ISOC) { /* Enable the Tx FIFO Empty Interrupt for this EP */ @@ -772,27 +806,20 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } else { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type == EP_TYPE_ISOC) - { - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } } else /* OUT endpoint */ { @@ -890,18 +917,21 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDe { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + /* Enable the Tx FIFO Empty Interrupt for this EP */ if (ep->xfer_len > 0U) { USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else /* OUT endpoint */ { @@ -959,7 +989,7 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin count32b = ((uint32_t)len + 3U) / 4U; for (i = 0U; i < count32b; i++) { - USBx_DFIFO((uint32_t)ch_ep_num) = *((__packed uint32_t *)pSrc); + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); pSrc++; } } @@ -968,15 +998,10 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin } /** - * @brief USB_ReadPacket : read a packet from the Tx FIFO associated - * with the EP/channel + * @brief USB_ReadPacket : read a packet from the RX FIFO * @param USBx Selected device * @param dest source pointer * @param len Number of bytes to read - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used * @retval pointer to destination buffer */ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) @@ -988,7 +1013,7 @@ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) for (i = 0U; i < count32b; i++) { - *(__packed uint32_t *)pDest = USBx_DFIFO(0U); + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); pDest++; } @@ -1260,13 +1285,9 @@ HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx) { uint32_t USBx_BASE = (uint32_t)USBx; - /* Set the MPS of the IN EP based on the enumeration speed */ + /* Set the MPS of the IN EP0 to 64 bytes */ USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - USBx_INEP(0U)->DIEPCTL |= 3U; - } USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; return HAL_OK; @@ -1433,7 +1454,7 @@ HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c if ((USBx->CID & (0x1U << 8)) != 0U) { - if (cfg.speed == USB_OTG_SPEED_FULL) + if (cfg.speed == USBH_FSLS_SPEED) { /* Force Device Enumeration to FS/LS mode only */ USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; @@ -1594,9 +1615,9 @@ HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state) * @param USBx Selected device * @retval speed : Host speed * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode + * @arg HCD_SPEED_HIGH: High speed mode + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode */ uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx) { @@ -1774,7 +1795,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe uint16_t num_packets; uint16_t max_hc_pkt_count = 256U; - if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USB_OTG_SPEED_HIGH)) + if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USBH_HS_SPEED)) { if ((dma == 0U) && (hc->do_ping == 1U)) { @@ -2002,7 +2023,6 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) uint32_t value; uint32_t i; - (void)USB_DisableGlobalInt(USBx); /* Flush FIFO */ @@ -2041,6 +2061,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) /* Clear any pending Host interrupts */ USBx_HOST->HAINT = 0xFFFFFFFFU; USBx->GINTSTS = 0xFFFFFFFFU; + (void)USB_EnableGlobalInt(USBx); return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h index 31ec3b02..988ba1ff 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_CORE_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -84,58 +84,55 @@ */ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); /* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_mps); +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr); -USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t ep_type, uint16_t ep_mps); -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); -uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -void USBD_LL_Delay (uint32_t Delay); +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); + +void USBD_LL_Delay(uint32_t Delay); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h index 9fa2873a..a4bfc44b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USB_REQUEST_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -73,16 +73,14 @@ * @{ */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h index b1e7968d..8219140f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_DEF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -61,9 +61,13 @@ #define USBD_SELF_POWERED 1U #endif /*USBD_SELF_POWERED */ -#ifndef USBD_SUPPORT_USER_STRING -#define USBD_SUPPORT_USER_STRING 0U -#endif /* USBD_SUPPORT_USER_STRING */ +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#ifndef USBD_CLASS_USER_STRING_DESC +#define USBD_CLASS_USER_STRING_DESC 0U +#endif /* USBD_CLASS_USER_STRING_DESC */ #define USB_LEN_DEV_QUALIFIER_DESC 0x0AU #define USB_LEN_DEV_DESC 0x12U @@ -158,37 +162,58 @@ typedef struct usb_setup_req { + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t wDescriptorLengthLow; + uint8_t wDescriptorLengthHigh; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USBD_ConfigDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} USBD_BosDescTypedef; - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}USBD_SetupReqTypedef; struct _USBD_HandleTypeDef; typedef struct _Device_cb { - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); + uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); #endif } USBD_ClassTypeDef; @@ -199,38 +224,44 @@ typedef enum USBD_SPEED_HIGH = 0U, USBD_SPEED_FULL = 1U, USBD_SPEED_LOW = 2U, -}USBD_SpeedTypeDef; +} USBD_SpeedTypeDef; /* Following USB Device status */ -typedef enum { - USBD_OK = 0U, +typedef enum +{ + USBD_OK = 0U, USBD_BUSY, + USBD_EMEM, USBD_FAIL, -}USBD_StatusTypeDef; +} USBD_StatusTypeDef; /* USB Device descriptors structure */ typedef struct { - uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1U) - uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); + uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_CLASS_USER_STRING_DESC == 1) + uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); +#endif +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) + uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); #endif } USBD_DescriptorsTypeDef; /* USB Device handle structure */ typedef struct { - uint32_t status; - uint32_t is_used; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; + uint32_t status; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; + uint16_t is_used; + uint16_t bInterval; } USBD_EndpointTypeDef; /* USB Device handle structure */ @@ -241,8 +272,8 @@ typedef struct _USBD_HandleTypeDef uint32_t dev_default_config; uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; @@ -251,6 +282,7 @@ typedef struct _USBD_HandleTypeDef uint8_t dev_connection_status; uint8_t dev_test_mode; uint32_t dev_remote_wakeup; + uint8_t ConfIdx; USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; @@ -258,6 +290,8 @@ typedef struct _USBD_HandleTypeDef void *pClassData; void *pUserData; void *pData; + void *pBosDesc; + void *pConfDesc; } USBD_HandleTypeDef; /** @@ -269,40 +303,57 @@ typedef struct _USBD_HandleTypeDef /** @defgroup USBD_DEF_Exported_Macros * @{ */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) +__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) +{ + uint16_t _SwapVal, _Byte1, _Byte2; + uint8_t *_pbuff = addr; -#define LOBYTE(x) ((uint8_t)(x & 0x00FFU)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00U) >> 8U)) + _Byte1 = *(uint8_t *)_pbuff; + _pbuff++; + _Byte2 = *(uint8_t *)_pbuff; + + _SwapVal = (_Byte2 << 8) | _Byte1; + + return _SwapVal; +} + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ #endif /* __GNUC__ */ /* In HS mode and when the DMA is used, all variables and data structures dealing with the DMA during the transaction process should be 4-bytes aligned */ -#if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN +#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4U))) +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif /* __ALIGN_BEGIN */ #else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ +#ifndef __ALIGN_END +#define __ALIGN_END +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#if defined (__CC_ARM) /* ARM Compiler */ +#define __ALIGN_BEGIN __align(4U) +#elif defined (__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ #endif /* __GNUC__ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h index 0552e00f..8f077c79 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_IOREQ_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -77,27 +77,22 @@ * @{ */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c index 1cc9b19f..e3db03fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -33,6 +33,7 @@ /** @defgroup USBD_CORE_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -50,13 +51,12 @@ /** @defgroup USBD_CORE_Private_Macros * @{ */ + /** * @} */ - - /** @defgroup USBD_CORE_Private_FunctionPrototypes * @{ */ @@ -73,6 +73,7 @@ * @} */ + /** @defgroup USBD_CORE_Private_Functions * @{ */ @@ -85,10 +86,13 @@ * @param id: Low level core index * @retval None */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, + USBD_DescriptorsTypeDef *pdesc, uint8_t id) { + USBD_StatusTypeDef ret; + /* Check whether the USB Host handle is valid */ - if(pdev == NULL) + if (pdev == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Device handle"); @@ -96,25 +100,31 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * return USBD_FAIL; } - /* Unlink previous class*/ - if(pdev->pClass != NULL) + /* Unlink previous class */ + if (pdev->pClass != NULL) { pdev->pClass = NULL; } + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + /* Assign USBD Descriptors */ - if(pdesc != NULL) + if (pdesc != NULL) { pdev->pDesc = pdesc; } /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; pdev->id = id; - /* Initialize low level driver */ - USBD_LL_Init(pdev); - return USBD_OK; + /* Initialize low level driver */ + ret = USBD_LL_Init(pdev); + + return ret; } /** @@ -125,19 +135,34 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * */ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + if (ret != USBD_OK) + { + return ret; + } /* Initialize low level driver */ - USBD_LL_DeInit(pdev); + ret = USBD_LL_DeInit(pdev); - return USBD_OK; + return ret; } /** @@ -147,24 +172,30 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) * @param pclass: Class handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) { - USBD_StatusTypeDef status = USBD_OK; - if(pclass != 0) - { - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - status = USBD_OK; - } - else + uint16_t len = 0U; + + if (pclass == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Class handle"); #endif - status = USBD_FAIL; + return USBD_FAIL; } - return status; + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + + /* Get Device Configuration Descriptor */ +#ifdef USE_USB_FS + pdev->pConfDesc = (void *)pdev->pClass->GetFSConfigDescriptor(&len); +#else /* USE_USB_HS */ + pdev->pConfDesc = (void *)pdev->pClass->GetHSConfigDescriptor(&len); +#endif /* USE_USB_FS */ + + + return USBD_OK; } /** @@ -173,13 +204,10 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) { - /* Start the low level driver */ - USBD_LL_Start(pdev); - - return USBD_OK; + return USBD_LL_Start(pdev); } /** @@ -188,15 +216,25 @@ USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } - return USBD_OK; + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + return ret; } /** @@ -205,7 +243,7 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -221,17 +259,14 @@ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - USBD_StatusTypeDef ret = USBD_FAIL; + USBD_StatusTypeDef ret = USBD_FAIL; - if(pdev->pClass != NULL) + if (pdev->pClass != NULL) { - /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0U) - { - ret = USBD_OK; - } + /* Set configuration and Start the Class */ + ret = (USBD_StatusTypeDef)pdev->pClass->Init(pdev, cfgidx); } return ret; @@ -244,10 +279,14 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx * @param cfgidx: configuration index * @retval status: USBD_StatusTypeDef */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - /* Clear configuration and De-initialize the Class process*/ - pdev->pClass->DeInit(pdev, cfgidx); + /* Clear configuration and De-initialize the Class process */ + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, cfgidx); + } + return USBD_OK; } @@ -260,6 +299,8 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { + USBD_StatusTypeDef ret; + USBD_ParseSetupRequest(&pdev->request, psetup); pdev->ep0_state = USBD_EP0_SETUP; @@ -268,24 +309,24 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) switch (pdev->request.bmRequest & 0x1FU) { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_DEVICE: + ret = USBD_StdDevReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_INTERFACE: + ret = USBD_StdItfReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_ENDPOINT: + ret = USBD_StdEPReq(pdev, &pdev->request); + break; - default: - USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; + default: + ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; } - return USBD_OK; + return ret; } /** @@ -298,48 +339,54 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) { - USBD_EndpointTypeDef *pep; + USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_out[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_OUT) + if (pdev->ep0_state == USBD_EP0_DATA_OUT) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { - pep->rem_length -= pep->maxpacket; + pep->rem_length -= pep->maxpacket; - USBD_CtlContinueRx (pdev, - pdata, - (uint16_t)MIN(pep->rem_length, pep->maxpacket)); + (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); } else { - if((pdev->pClass->EP0_RxReady != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_RxReady != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_RxReady(pdev); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else { +#if 0 if (pdev->ep0_state == USBD_EP0_STATUS_OUT) { /* * STATUS PHASE completed, update ep0_state to idle */ pdev->ep0_state = USBD_EP0_IDLE; - USBD_LL_StallEP(pdev, 0U); + (void)USBD_LL_StallEP(pdev, 0U); } +#endif } } - else if((pdev->pClass->DataOut != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataOut != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataOut(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataOut(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -357,69 +404,78 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, - uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_in[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_IN) + if (pdev->ep0_state == USBD_EP0_DATA_IN) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; - USBD_CtlContinueSendData (pdev, pdata, (uint16_t)pep->rem_length); + (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else - { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0U) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) + { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->maxpacket == pep->rem_length) && + (pep->total_length >= pep->maxpacket) && + (pep->total_length < pdev->ep0_data_len)) { - USBD_CtlContinueSendData(pdev, NULL, 0U); + (void)USBD_CtlContinueSendData(pdev, NULL, 0U); pdev->ep0_data_len = 0U; /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else { - if((pdev->pClass->EP0_TxSent != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_TxSent != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_TxSent(pdev); } - USBD_LL_StallEP(pdev, 0x80U); - USBD_CtlReceiveStatus(pdev); + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_CtlReceiveStatus(pdev); } } } else { +#if 0 if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || (pdev->ep0_state == USBD_EP0_IDLE)) { - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0x80U); } +#endif } if (pdev->dev_test_mode == 1U) { - USBD_RunTestMode(pdev); + (void)USBD_RunTestMode(pdev); pdev->dev_test_mode = 0U; } } - else if((pdev->pClass->DataIn != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataIn != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataIn(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataIn(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -437,29 +493,30 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, * @retval status */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { - /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClassData != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } + + /* Open EP0 OUT */ + (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_out[0x00U & 0xFU].is_used = 1U; pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_in[0x80U & 0xFU].is_used = 1U; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config= 0U; - pdev->dev_remote_wakeup = 0U; - - if (pdev->pClassData) - { - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); - } return USBD_OK; } @@ -470,9 +527,11 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, + USBD_SpeedTypeDef speed) { pdev->dev_speed = speed; + return USBD_OK; } @@ -483,10 +542,11 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef * @retval status */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) { - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + return USBD_OK; } @@ -497,9 +557,13 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) { - pdev->dev_state = pdev->dev_old_state; + if (pdev->dev_state == USBD_STATE_SUSPENDED) + { + pdev->dev_state = pdev->dev_old_state; + } + return USBD_OK; } @@ -510,15 +574,16 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) { - if(pdev->dev_state == USBD_STATE_CONFIGURED) + if (pdev->dev_state == USBD_STATE_CONFIGURED) { - if(pdev->pClass->SOF != NULL) + if (pdev->pClass->SOF != NULL) { pdev->pClass->SOF(pdev); } } + return USBD_OK; } @@ -528,7 +593,8 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -543,7 +609,8 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -558,7 +625,7 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -572,11 +639,15 @@ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } return USBD_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c index c3e7ecbe..c51f3497 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -35,6 +35,7 @@ /** @defgroup USBD_REQ_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -52,6 +53,7 @@ /** @defgroup USBD_REQ_Private_Macros * @{ */ + /** * @} */ @@ -60,6 +62,7 @@ /** @defgroup USBD_REQ_Private_Variables * @{ */ + /** * @} */ @@ -68,27 +71,13 @@ /** @defgroup USBD_REQ_Private_FunctionPrototypes * @{ */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t USBD_GetLen(uint8_t *buf); /** @@ -108,7 +97,7 @@ static uint8_t USBD_GetLen(uint8_t *buf); * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -116,41 +105,38 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType { case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup(pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req); + USBD_GetDescriptor(pdev, req); break; case USB_REQ_SET_ADDRESS: - USBD_SetAddress (pdev, req); + USBD_SetAddress(pdev, req); break; case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev, req); + ret = USBD_SetConfig(pdev, req); break; case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev, req); + USBD_GetConfig(pdev, req); break; case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev, req); + USBD_GetStatus(pdev, req); break; - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev, req); + USBD_SetFeature(pdev, req); break; case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev, req); + USBD_ClrFeature(pdev, req); break; default: @@ -174,7 +160,7 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -191,11 +177,11 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); if ((req->wLength == 0U) && (ret == USBD_OK)) { - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else @@ -215,7 +201,7 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType break; } - return USBD_OK; + return ret; } /** @@ -225,43 +211,31 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - uint8_t ep_addr; + USBD_EndpointTypeDef *pep; + uint8_t ep_addr; USBD_StatusTypeDef ret = USBD_OK; - USBD_EndpointTypeDef *pep; - ep_addr = LOBYTE(req->wIndex); + ep_addr = LOBYTE(req->wIndex); switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - /* Check if it is a class request */ - if ((req->bmRequest & 0x60U) == 0x20U) - { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); - - return ret; - } - switch (req->bRequest) { - - case USB_REQ_SET_FEATURE : - + case USB_REQ_SET_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -274,10 +248,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) { - USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, ep_addr); } } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); break; @@ -287,15 +261,15 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } break; - case USB_REQ_CLEAR_FEATURE : + case USB_REQ_CLEAR_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -308,9 +282,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr & 0x7FU) != 0x00U) { - USBD_LL_ClearStallEP(pdev, ep_addr); + (void)USBD_LL_ClearStallEP(pdev, ep_addr); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); + (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); } break; @@ -329,16 +304,16 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped USBD_CtlError(pdev, req); break; } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; - pep->status = 0x0000U; + pep->status = 0x0000U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); - break; + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); + break; case USBD_STATE_CONFIGURED: - if((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80U) == 0x80U) { if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) { @@ -355,14 +330,14 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) { pep->status = 0x0000U; } - else if(USBD_LL_IsStallEP(pdev, ep_addr)) + else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) { pep->status = 0x0001U; } @@ -371,7 +346,7 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped pep->status = 0x0000U; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); break; default: @@ -393,6 +368,8 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped return ret; } + + /** * @brief USBD_GetDescriptor * Handle Get Descriptor requests @@ -400,18 +377,25 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped * @param req: usb request * @retval status */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - uint16_t len; - uint8_t *pbuf; - + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t err = 0U; switch (req->wValue >> 8) { -#if (USBD_LPM_ENABLED == 1U) +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) case USB_DESC_TYPE_BOS: - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetBOSDescriptor != NULL) + { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; #endif case USB_DESC_TYPE_DEVICE: @@ -419,14 +403,14 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; case USB_DESC_TYPE_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } else { - pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } break; @@ -435,81 +419,159 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , switch ((uint8_t)(req->wValue)) { case USBD_IDX_LANGID_STR: - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_MFC_STR: - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_PRODUCT_STR: - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetProductStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_SERIAL_STR: - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetSerialStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_CONFIG_STR: - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_INTERFACE_STR: - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; default: -#if (USBD_SUPPORT_USER_STRING == 1U) - pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); - break; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) + { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } +#elif (USBD_CLASS_USER_STRING_DESC == 1U) + if (pdev->pDesc->GetUserStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } #else - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; #endif + break; } break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if(pdev->dev_speed == USBD_SPEED_HIGH) + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); - break; + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) + { return; } - - if((len != 0U) && (req->wLength != 0U)) + else { - - len = MIN(len, req->wLength); - - USBD_CtlSendData (pdev, pbuf, len); - } - - if(req->wLength == 0U) - { - USBD_CtlSendStatus(pdev); + if (req->wLength != 0U) + { + if (len != 0U) + { + len = MIN(len, req->wLength); + (void)USBD_CtlSendData(pdev, pbuf, len); + } + else + { + USBD_CtlError(pdev, req); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } } } @@ -520,8 +582,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { uint8_t dev_addr; @@ -531,13 +592,13 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { pdev->dev_address = dev_addr; - USBD_LL_SetUSBAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); + (void)USBD_LL_SetUSBAddress(pdev, dev_addr); + (void)USBD_CtlSendStatus(pdev); if (dev_addr != 0U) { @@ -562,8 +623,9 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { + USBD_StatusTypeDef ret = USBD_OK; static uint8_t cfgidx; cfgidx = (uint8_t)(req->wValue); @@ -571,63 +633,77 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { USBD_CtlError(pdev, req); + return USBD_FAIL; } - else + + switch (pdev->dev_state) { - switch (pdev->dev_state) + case USBD_STATE_ADDRESSED: + if (cfgidx != 0U) { - case USBD_STATE_ADDRESSED: - if (cfgidx) + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { - pdev->dev_config = cfgidx; + USBD_CtlError(pdev, req); + } + else + { + (void)USBD_CtlSendStatus(pdev); pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev, cfgidx); - USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - USBD_ClrClassConfig(pdev, cfgidx); - break; } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + (void)USBD_ClrClassConfig(pdev, cfgidx); + (void)USBD_CtlSendStatus(pdev); + } + else if (cfgidx != pdev->dev_config) + { + /* Clear old configuration */ + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) + { + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + pdev->dev_state = USBD_STATE_ADDRESSED; + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, cfgidx); + ret = USBD_FAIL; + break; } + + return ret; } /** @@ -641,7 +717,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { if (req->wLength != 1U) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { @@ -650,15 +726,15 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: pdev->dev_default_config = 0U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); break; case USBD_STATE_CONFIGURED: - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } } @@ -678,28 +754,28 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: - if(req->wLength != 0x2U) + if (req->wLength != 0x2U) { USBD_CtlError(pdev, req); break; } -#if ( USBD_SELF_POWERED == 1U) +#if (USBD_SELF_POWERED == 1U) pdev->dev_config_status = USB_CONFIG_SELF_POWERED; #else pdev->dev_config_status = 0U; #endif - if (pdev->dev_remote_wakeup) + if (pdev->dev_remote_wakeup != 0U) { pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); break; - default : - USBD_CtlError(pdev , req); + default: + USBD_CtlError(pdev, req); break; } } @@ -712,16 +788,13 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * @param req: usb request * @retval status */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { pdev->dev_remote_wakeup = 1U; - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } - } @@ -732,24 +805,23 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { switch (pdev->dev_state) { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - USBD_CtlSendStatus(pdev); - } - break; + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 0U; + (void)USBD_CtlSendStatus(pdev); + } + break; - default : - USBD_CtlError(pdev , req); - break; + default: + USBD_CtlError(pdev, req); + break; } } @@ -763,12 +835,23 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) { - req->bmRequest = *(uint8_t *) (pdata); - req->bRequest = *(uint8_t *) (pdata + 1); - req->wValue = SWAPBYTE (pdata + 2); - req->wIndex = SWAPBYTE (pdata + 4); - req->wLength = SWAPBYTE (pdata + 6); + uint8_t *pbuff = pdata; + req->bmRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->bRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->wValue = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wIndex = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wLength = SWAPBYTE(pbuff); } /** @@ -779,11 +862,12 @@ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) * @retval None */ -void USBD_CtlError( USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_LL_StallEP(pdev , 0x80U); - USBD_LL_StallEP(pdev , 0U); + UNUSED(req); + + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0U); } @@ -798,18 +882,29 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) { uint8_t idx = 0U; + uint8_t *pdesc; - if (desc != NULL) + if (desc == NULL) { - *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; - unicode[idx++] = *(uint8_t *)(void *)len; - unicode[idx++] = USB_DESC_TYPE_STRING; + return; + } - while (*desc != '\0') - { - unicode[idx++] = *desc++; - unicode[idx++] = 0U; - } + pdesc = desc; + *len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U; + + unicode[idx] = *(uint8_t *)len; + idx++; + unicode[idx] = USB_DESC_TYPE_STRING; + idx++; + + while (*pdesc != (uint8_t)'\0') + { + unicode[idx] = *pdesc; + pdesc++; + idx++; + + unicode[idx] = 0U; + idx++; } } @@ -821,15 +916,16 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) */ static uint8_t USBD_GetLen(uint8_t *buf) { - uint8_t len = 0U; + uint8_t len = 0U; + uint8_t *pbuff = buf; - while (*buf != '\0') - { - len++; - buf++; - } + while (*pbuff != (uint8_t)'\0') + { + len++; + pbuff++; + } - return len; + return len; } /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c index 5600c370..4d5c8efe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -84,16 +84,16 @@ * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_IN; pdev->ep_in[0].total_length = len; - pdev->ep_in[0].rem_length = len; + pdev->ep_in[0].rem_length = len; - /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -106,11 +106,11 @@ USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - /* Start the next transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the next transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -123,16 +123,16 @@ USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_OUT; pdev->ep_out[0].total_length = len; - pdev->ep_out[0].rem_length = len; + pdev->ep_out[0].rem_length = len; /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -145,10 +145,10 @@ USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -159,13 +159,13 @@ USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_IN; /* Start the transfer */ - USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); return USBD_OK; } @@ -176,13 +176,13 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_OUT; - /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + /* Start the transfer */ + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); return USBD_OK; } @@ -194,7 +194,7 @@ USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) * @param ep_addr: endpoint address * @retval Rx Data blength */ -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.c index 2c7b2f09..6738d157 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.c @@ -504,7 +504,7 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; @@ -524,7 +524,7 @@ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, u * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h index 457df6b8..13647fbd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_conf.h @@ -68,8 +68,6 @@ /*---------- -----------*/ #define USBD_MAX_STR_DESC_SIZ 512U /*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0U -/*---------- -----------*/ #define USBD_DEBUG_LEVEL 0U /*---------- -----------*/ #define USBD_LPM_ENABLED 0U @@ -81,6 +79,9 @@ #define DEVICE_FS 0 #define DEVICE_HS 1 +/* Inform USB core that a full speed device is used. */ +#define USE_USB_FS + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c index c26b821d..344676bb 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Boot/usbd_desc.c @@ -123,11 +123,6 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); - -#ifdef USBD_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - #if (USBD_LPM_ENABLED == 1) uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); #endif /* (USBD_LPM_ENABLED == 1) */ @@ -328,7 +323,9 @@ uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) /* Update the serial number string descriptor with the data from the unique * ID */ Get_SerialNum(); - + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ return (uint8_t *) USBD_StringSerial; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/bin/demoprog_stm32f746.out b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/bin/demoprog_stm32f746.out index 9007b51d9b70609528910dac5cdc386a7fa1024f..0ee1ccc5208e4e9166352151c3825a8eab0bb6ab 100644 GIT binary patch delta 31292 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 delta 31263 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 stm32f746 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio.h + $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f746xx.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_can.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_gpio.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_cortex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_can.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_can.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash_ex.c + $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_def.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_exti.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pwr_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_gpio.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_dma_ex.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_gpio.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c + $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\system_stm32f7xx.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_exti.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_cortex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_flash_ex.h $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_i2c_ex.h - $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_compiler.h - $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_iccarm.h $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_version.h - $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f746xx.h $PROJ_DIR$\..\lib\CMSIS\Include\core_cm7.h - $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h - $PROJ_DIR$\..\lib\CMSIS\Device\ST\STM32F7xx\Include\system_stm32f7xx.h + $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_iccarm.h + $PROJ_DIR$\..\lib\CMSIS\Include\cmsis_compiler.h + $PROJ_DIR$\..\obj\timer.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.__cstat.et + $PROJ_DIR$\..\obj\boot.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.__cstat.et + $PROJ_DIR$\..\obj\led.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c + $PROJ_DIR$\..\..\Boot\blt_conf.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.__cstat.et + $PROJ_DIR$\..\obj\main.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_it.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.__cstat.et + $PROJ_DIR$\..\obj\system_stm32f7xx.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.o + $PROJ_DIR$\..\boot.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_uart.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_pwr_ex.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim.c + $PROJ_DIR$\..\lib\stm32f7xx_hal_conf.h + $PROJ_DIR$\..\lib\system_stm32f7xx.c + $PROJ_DIR$\..\startup_stm32f746xx.s + $PROJ_DIR$\..\timer.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c + $PROJ_DIR$\..\boot.h + $PROJ_DIR$\..\timer.h + $PROJ_DIR$\..\led.c $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_uart_ex.h + $PROJ_DIR$\..\header.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc_ex.h + $PROJ_DIR$\..\led.h $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c - $PROJ_DIR$\..\obj\system_stm32f7xx.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_it.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.__cstat.et - $PROJ_DIR$\..\obj\main.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.__cstat.et - $PROJ_DIR$\..\obj\boot.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.__cstat.et - $PROJ_DIR$\..\..\Boot\blt_conf.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.__cstat.et - $PROJ_DIR$\..\obj\led.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.__cstat.et - $PROJ_DIR$\..\obj\timer.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.pbi + $TOOLKIT_DIR$\inc\c\intrinsics.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.__cstat.et $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.pbi $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.o $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c - $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.o $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.__cstat.et $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Full.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.o $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.pbi $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.pbi - $TOOLKIT_DIR$\inc\c\ycheck.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.pbi - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_crc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.o - $TOOLKIT_DIR$\inc\c\intrinsics.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_tim_template.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_uart.h - $PROJ_DIR$\..\lib\stm32f7xx_hal_conf.h - $PROJ_DIR$\..\lib\system_stm32f7xx.c - $PROJ_DIR$\..\header.h - $PROJ_DIR$\..\led.h - $PROJ_DIR$\..\main.c - $PROJ_DIR$\..\timer.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_uart_ex.h - $PROJ_DIR$\..\boot.h - $PROJ_DIR$\..\led.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_hal_rcc_ex.h - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.pbi - $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart_ex.c - $PROJ_DIR$\..\boot.c - $PROJ_DIR$\..\startup_stm32f746xx.s - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.pbi - $PROJ_DIR$\..\timer.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c - $PROJ_DIR$\..\obj\stm32f7xx_hal.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_rcc.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dcmi_ex.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.pbi + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_wwdg.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + $PROJ_DIR$\..\obj\led.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.__cstat.et $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c - $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.xcl - $PROJ_DIR$\..\obj\led.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c $PROJ_DIR$\..\obj\stm32f7xx_hal_dma.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp.pbi $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mdios.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_pwr.h - $PROJ_DIR$\..\lib\CMSIS\Include\core_cmInstr.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.o - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $TOOLKIT_DIR$\inc\c\yvals.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.o - $PROJ_DIR$\..\obj\boot.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c - $PROJ_DIR$\..\obj\timer.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.o - $PROJ_DIR$\..\lib\CMSIS\Include\core_cmFunc.h - $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.pbi - $PROJ_DIR$\..\obj\led.xcl - $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.pbi - $PROJ_DIR$\..\obj\stm32f7xx_it.pbi - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c - $PROJ_DIR$\..\bin\demoprog_stm32f746.srec - $TOOLKIT_DIR$\inc\c\iccarm_builtin.h - $PROJ_DIR$\..\obj\stm32f7xx_hal.__cstat.et - $PROJ_DIR$\..\lib\CMSIS\Include\core_cmSimd.h - $PROJ_DIR$\..\stm32f7xx_it.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.xcl - $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.pbi - $PROJ_DIR$\..\obj\timer.xcl - $PROJ_DIR$\..\main.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.__cstat.et - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_wwdg.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usb.c - $PROJ_DIR$\..\stm32f7xx_it.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_qspi.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma2d.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma_ex.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c + $PROJ_DIR$\..\obj\stm32f7xx_hal.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_dfsdm.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.xcl + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_rcc.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.xcl $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.xcl $PROJ_DIR$\..\obj\boot.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.o - $PROJ_DIR$\..\obj\system_stm32f7xx.xcl - $PROJ_DIR$\..\obj\stm32f746.pbd - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_system.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.xcl + $PROJ_DIR$\..\main.h + $PROJ_DIR$\..\lib\CMSIS\Include\core_cmSimd.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2s.o + $PROJ_DIR$\..\stm32f7xx_it.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_rcc.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_wwdg.c + $PROJ_DIR$\..\obj\timer.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.xcl $PROJ_DIR$\..\obj\stm32f7xx_hal_tim.xcl - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_tim.c $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.__cstat.et + $PROJ_DIR$\..\obj\system_stm32f7xx.xcl $PROJ_DIR$\..\stm32f7xx_hal_msp.c $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard_ex.o $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usb.c $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.__cstat.et $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_utils.h - $PROJ_DIR$\..\obj\main.xcl - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.o - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c - $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.pbi - $TOOLKIT_DIR$\inc\c\stddef.h - $TOOLKIT_DIR$\lib\rt7M_tl.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.o - $PROJ_DIR$\..\stm32f746xx_flash.icf - $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.__cstat.et + $PROJ_DIR$\..\stm32f7xx_it.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_smbus.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.o + $PROJ_DIR$\..\obj\stm32f746.pbd + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_system.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_sdmmc.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.pbi + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\iccarm_builtin.h + $PROJ_DIR$\..\obj\stm32f7xx_hal.__cstat.et + $PROJ_DIR$\..\lib\CMSIS\Include\core_cmInstr.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_irda.o + $PROJ_DIR$\..\bin\demoprog_stm32f746.srec + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.o + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mdios.c + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_cortex.__cstat.et + $PROJ_DIR$\..\obj\led.xcl + $PROJ_DIR$\..\obj\stm32f7xx_it.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_spi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.xcl + $PROJ_DIR$\..\lib\CMSIS\Include\core_cmFunc.h + $PROJ_DIR$\..\obj\boot.xcl + $PROJ_DIR$\..\obj\stm32f7xx_hal_sram.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_pwr.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c + $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.__cstat.et + $PROJ_DIR$\..\obj\system_stm32f7xx.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.__cstat.et + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.__cstat.et + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.__cstat.et + $PROJ_DIR$\..\obj\demoprog_stm32f746.map + $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.o + $PROJ_DIR$\..\bin\demoprog_stm32f746.out + $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.xcl + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.o $PROJ_DIR$\..\obj\stm32f7xx_hal_iwdg.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.o $PROJ_DIR$\..\lib\CMSIS\Include\mpu_armv7.h $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.o $PROJ_DIR$\..\obj\stm32f7xx_hal_usart.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.o + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Inc\stm32f7xx_ll_utils.h + $TOOLKIT_DIR$\inc\c\stddef.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_lptim.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_rtc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_nor.o $PROJ_DIR$\..\obj\stm32f7xx_ll_adc.o + $PROJ_DIR$\..\stm32f746xx_flash.icf $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_flash_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_alarm_template.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_sd.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.__cstat.et + $PROJ_DIR$\..\obj\main.xcl $PROJ_DIR$\..\obj\stm32f7xx_ll_i2c.o $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.o $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_tim_ex.o $PROJ_DIR$\..\obj\stm32f7xx_hal_sai.o $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.o $PROJ_DIR$\..\obj\stm32f7xx_hal_crc_ex.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.pbi $PROJ_DIR$\..\obj\stm32f7xx_hal_uart_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_sdram.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.o - $PROJ_DIR$\..\obj\demoprog_stm32f746.map - $PROJ_DIR$\..\obj\stm32f7xx_hal_mmc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_exti.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_sdmmc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_lptim.__cstat.et - $TOOLKIT_DIR$\inc\c\ysizet.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_exti.xcl - $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_flash.o - $PROJ_DIR$\..\obj\system_stm32f7xx.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_eth.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_hcd.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_spi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_spdifrx.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_smartcard.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_rng.__cstat.et - $PROJ_DIR$\..\bin\demoprog_stm32f746.out - $PROJ_DIR$\..\obj\stm32f7xx_ll_rtc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_gpio.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_tim.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_utils.o - $TOOLKIT_DIR$\lib\dl7M_tln.a - $PROJ_DIR$\..\obj\stm32f7xx_ll_pwr.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_ll_dma.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_i2c_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_gpio.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart_ex.xcl - $TOOLKIT_DIR$\inc\c\stdio.h - $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.o - $PROJ_DIR$\..\obj\main.o - $TOOLKIT_DIR$\inc\c\ystdio.h - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.pbi - $TOOLKIT_DIR$\lib\shb_l.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.o + $TOOLKIT_DIR$\lib\rt7M_tl.a + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.__cstat.et + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.__cstat.et + $TOOLKIT_DIR$\inc\c\stdint.h + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_can.__cstat.et + $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.o + $TOOLKIT_DIR$\lib\m7M_tls.a $PROJ_DIR$\..\obj\stm32f7xx_hal_cryp_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.pbi $PROJ_DIR$\..\obj\stm32f7xx_ll_dma2d.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd_ex.o + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart.o $PROJ_DIR$\..\obj\stm32f7xx_hal_dsi.pbi $TOOLKIT_DIR$\inc\c\cmsis_iar.h $PROJ_DIR$\..\obj\stm32f7xx_hal_sai_ex.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_qspi.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.o - $TOOLKIT_DIR$\inc\c\DLib_Threads.h $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.o - $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.o - $PROJ_DIR$\..\obj\startup_stm32f746xx.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_msp_template.pbi + $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.pbi $PROJ_DIR$\..\obj\stm32f7xx_it.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_uart_ex.xcl $PROJ_DIR$\..\obj\stm32f7xx_hal_cec.pbi + $PROJ_DIR$\..\obj\stm32f7xx_ll_dac.o + $TOOLKIT_DIR$\inc\c\ystdio.h + $PROJ_DIR$\..\obj\stm32f7xx_ll_usart.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\..\obj\startup_stm32f746xx.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_usb.o + $TOOLKIT_DIR$\inc\c\stdio.h $PROJ_DIR$\..\obj\stm32f7xx_hal_ltdc_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_mdios.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_nand.o + $PROJ_DIR$\..\obj\stm32f7xx_ll_fmc.o $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_dma2d.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_crc.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_jpeg.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_rng.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_dac_ex.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_hash.pbi - $PROJ_DIR$\..\obj\stm32f7xx_hal_pcd.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_can.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_adc_ex.__cstat.et - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr.o - $PROJ_DIR$\..\obj\stm32f7xx_hal_rcc_ex.o - $TOOLKIT_DIR$\inc\c\stdint.h - $TOOLKIT_DIR$\lib\m7M_tls.a - $PROJ_DIR$\..\obj\stm32f7xx_hal_pwr_ex.o + $PROJ_DIR$\..\obj\stm32f7xx_hal_timebase_rtc_wakeup_template.o + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\obj\stm32f7xx_hal_dac.pbi [ROOT_NODE] ILINK - 399 381 + 372 360 - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c - - - ICCARM - 134 - - - BICOMP - 250 - - - __cstat - 305 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c - - - ICCARM - 344 - - - BICOMP - 260 - - - __cstat - 189 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_can.c ICCARM - 136 - - - BICOMP - 251 + 79 __cstat - 450 + 423 + + + BICOMP + 284 ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 @@ -546,182 +500,21 @@ ICCARM - 452 - - - BICOMP - 71 + 411 __cstat - 96 + 43 + + + BICOMP + 112 ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_gpio.c - - - ICCARM - 401 - - - BICOMP - 254 - - - __cstat - 188 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c - - - ICCARM - 59 - - - BICOMP - 228 - - - __cstat - 108 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c - - - ICCARM - 391 - - - BICOMP - 233 - - - __cstat - 103 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c - - - ICCARM - 435 - - - BICOMP - 277 - - - __cstat - 93 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c - - - ICCARM - 453 - - - BICOMP - 332 - - - __cstat - 39 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c - - - ICCARM - 372 - - - BICOMP - 389 - - - __cstat - 364 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c - - - ICCARM - 154 - - - BICOMP - 230 - - - __cstat - 315 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 @@ -730,67 +523,21 @@ ICCARM - 456 - - - BICOMP - 226 + 412 __cstat - 52 + 123 + + + BICOMP + 282 ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c - - - ICCARM - 44 - - - BICOMP - 283 - - - __cstat - 111 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c - - - ICCARM - 409 - - - BICOMP - 263 - - - __cstat - 118 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 @@ -799,141 +546,228 @@ ICCARM - 365 - - - BICOMP - 273 + 393 __cstat - 113 + 83 + + + BICOMP + 226 ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma.c ICCARM - 440 - - - BICOMP - 115 + 158 __cstat - 70 + 84 + + + BICOMP + 242 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_gpio.c ICCARM - 357 - - - BICOMP - 121 + 362 __cstat - 102 + 178 + + + BICOMP + 249 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cortex.c ICCARM - 375 - - - BICOMP - 138 + 77 __cstat - 406 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c - - - ICCARM - 395 + 332 BICOMP + 259 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_flash.c + + + ICCARM + 369 + + + __cstat 49 - - __cstat - 92 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c - - - ICCARM - 413 - BICOMP - 308 - - - __cstat - 262 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c - - - ICCARM - 99 - - - BICOMP - 441 - - - __cstat - 451 + 263 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal.c + + + ICCARM + 211 + + + __cstat + 322 + + + BICOMP + 279 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma_ex.c + + + ICCARM + 124 + + + __cstat + 36 + + + BICOMP + 261 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c.c + + + ICCARM + 303 + + + __cstat + 182 + + + BICOMP + 223 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2c_ex.c + + + ICCARM + 352 + + + __cstat + 93 + + + BICOMP + 236 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_exti.c + + + ICCARM + 399 + + + __cstat + 396 + + + BICOMP + 376 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 @@ -942,21 +776,61 @@ ICCARM - 139 - - - BICOMP - 426 + 81 __cstat - 442 + 413 + + + BICOMP + 437 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usart.c + + + ICCARM + 443 + + + __cstat + 235 + + + BICOMP + 319 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_adc_ex.c + + + ICCARM + 63 + + + __cstat + 416 + + + BICOMP + 453 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -965,297 +839,101 @@ ICCARM - 123 - - - BICOMP - 202 + 88 __cstat - 159 + 205 + + + BICOMP + 176 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nor.c ICCARM - 369 - - - BICOMP - 425 + 389 __cstat - 77 + 66 + + + BICOMP + 86 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_pwr.c ICCARM - 423 + 404 + + + __cstat + 348 BICOMP - 221 + 82 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_spi.c + + + ICCARM + 350 + + + __cstat + 57 + + + BICOMP + 117 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc_ex.c + + + ICCARM + 448 __cstat 104 - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c - - - ICCARM - 359 - BICOMP - 166 - - - __cstat - 75 + 74 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c - - - ICCARM - 261 - - - BICOMP - 428 - - - __cstat - 161 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c - - - ICCARM - 393 - - - BICOMP - 198 - - - __cstat - 117 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c - - - ICCARM - 370 - - - BICOMP - 297 - - - __cstat - 152 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c - - - ICCARM - 422 - - - BICOMP - 320 - - - __cstat - 109 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\lib\system_stm32f7xx.c - - - ICCARM - 392 - - - BICOMP - 335 - - - __cstat - 54 - - - - - ICCARM - 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 21 205 12 18 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 - - - - - $PROJ_DIR$\..\main.c - - - ICCARM - 418 - - - BICOMP - 349 - - - __cstat - 68 - - - - - ICCARM - 207 83 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 21 205 12 18 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 212 208 225 - - - - - $PROJ_DIR$\..\timer.c - - - ICCARM - 303 - - - BICOMP - 324 - - - __cstat - 107 - - - - - ICCARM - 207 83 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 21 205 12 18 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 212 208 225 - - - - - $PROJ_DIR$\..\led.c - - - ICCARM - 274 - - - BICOMP - 309 - - - __cstat - 97 - - - - - ICCARM - 207 83 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 21 205 12 18 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 212 208 225 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart_ex.c - - - ICCARM - 363 - - - BICOMP - 411 - - - __cstat - 378 - - - - - ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -1264,21 +942,182 @@ ICCARM - 333 - - - BICOMP - 301 + 286 __cstat - 81 + 41 + + + BICOMP + 340 ICCARM - 207 83 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 21 205 12 18 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 212 208 225 + 154 59 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 16 140 155 12 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 145 157 146 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc.c + + + ICCARM + 449 + + + __cstat + 62 + + + BICOMP + 237 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart.c + + + ICCARM + 431 + + + __cstat + 37 + + + BICOMP + 287 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 430 + + + __cstat + 109 + + + BICOMP + 397 + + + + + ICCARM + 154 59 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 16 140 155 12 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 145 157 146 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rcc_ex.c + + + ICCARM + 418 + + + __cstat + 148 + + + BICOMP + 295 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_uart_ex.c + + + ICCARM + 401 + + + __cstat + 407 + + + BICOMP + 439 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim.c + + + ICCARM + 252 + + + __cstat + 209 + + + BICOMP + 296 + + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\lib\system_stm32f7xx.c + + + ICCARM + 349 + + + __cstat + 128 + + + BICOMP + 300 + + + + + ICCARM + 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 16 140 155 12 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 @@ -1287,53 +1126,627 @@ AARM - 437 + 445 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim.c + $PROJ_DIR$\..\timer.c ICCARM - 272 + 330 + + + __cstat + 35 + + + BICOMP + 294 + + + + + ICCARM + 154 59 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 16 140 155 12 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 145 157 146 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_tim_ex.c + + + ICCARM + 402 + + + __cstat + 191 BICOMP 338 + + + + ICCARM + 16 140 155 12 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 229 + __cstat - 156 + 47 + + + BICOMP + 333 ICCARM - 21 205 12 18 37 35 36 454 169 296 177 158 295 34 32 33 314 361 38 17 353 388 214 22 3 19 24 28 7 10 16 30 26 31 13 0 204 211 + 154 59 10 0 32 417 216 328 175 204 320 31 34 33 321 382 21 16 140 155 12 11 386 357 156 24 18 13 3 17 27 8 2 29 5 30 6 136 135 153 145 157 146 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_eth.c ICCARM - 367 + 370 + + + __cstat + 76 BICOMP - 175 + 168 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_msp_template.c + + + ICCARM + 392 + + + __cstat + 118 + + + BICOMP + 436 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c + + + ICCARM + 394 + + + __cstat + 115 + + + BICOMP + 193 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dsi.c + + + ICCARM + 251 + + + __cstat + 202 + + + BICOMP + 432 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c + + + ICCARM + 454 + + + __cstat + 42 + + + BICOMP + 264 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c + + + ICCARM + 337 __cstat 60 + + BICOMP + 380 + ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c + + + ICCARM + 196 + + + __cstat + 70 + + + BICOMP + 419 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c + + + ICCARM + 212 + + + __cstat + 85 + + + BICOMP + 405 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + + + ICCARM + 435 + + + __cstat + 44 + + + BICOMP + 406 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + + + ICCARM + 68 + + + __cstat + 122 + + + BICOMP + 166 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c + + + ICCARM + 424 + + + __cstat + 65 + + + BICOMP + 96 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c + + + ICCARM + 200 + + + __cstat + 73 + + + BICOMP + 456 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c + + + ICCARM + 327 + + + __cstat + 114 + + + BICOMP + 387 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c + + + ICCARM + 89 + + + __cstat + 69 + + + BICOMP + 421 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c + + + ICCARM + 415 + + + __cstat + 56 + + + BICOMP + 94 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c + + + ICCARM + 75 + + + __cstat + 356 + + + BICOMP + 189 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c + + + ICCARM + 218 + + + __cstat + 87 + + + BICOMP + 426 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c + + + ICCARM + 119 + + + __cstat + 214 + + + BICOMP + 160 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c + + + ICCARM + 324 + + + __cstat + 105 + + + BICOMP + 95 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c + + + ICCARM + 152 + + + __cstat + 170 + + + BICOMP + 414 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c + + + ICCARM + 206 + + + __cstat + 310 + + + BICOMP + 440 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c + + + ICCARM + 366 + + + __cstat + 307 + + + BICOMP + 184 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c + + + ICCARM + 451 + + + __cstat + 54 + + + BICOMP + 72 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c + + + ICCARM + 292 + + + __cstat + 108 + + + BICOMP + 102 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c + + + ICCARM + 429 + + + __cstat + 383 + + + BICOMP + 80 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -1342,44 +1755,67 @@ ICCARM - 431 - - - BICOMP - 128 + 428 __cstat - 84 + 40 + + + BICOMP + 67 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c ICCARM - 394 - - - BICOMP - 170 + 198 __cstat - 126 + 217 + + + BICOMP + 207 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c + + + ICCARM + 364 + + + __cstat + 98 + + + BICOMP + 163 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -1390,346 +1826,59 @@ ICCARM 427 + + __cstat + 194 + BICOMP - 215 + 179 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sd.c + + + ICCARM + 395 __cstat - 148 + 126 + + + BICOMP + 173 + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mmc.c ICCARM - 382 - - - BICOMP - 122 + 365 __cstat - 40 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c - - - ICCARM - 371 - - - BICOMP - 160 - - - __cstat - 42 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c - - - ICCARM - 350 - - - BICOMP - 66 - - - __cstat - 398 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c - - - ICCARM - 343 - - - BICOMP - 186 - - - __cstat - 61 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c - - - ICCARM - 355 - - - BICOMP - 196 - - - __cstat - 87 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c - - - ICCARM - 380 - - - BICOMP - 448 - - - __cstat - 132 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c - - - ICCARM - 318 - - - BICOMP - 179 - - - __cstat - 41 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c - - - ICCARM - 321 - - - BICOMP - 220 - - - __cstat - 62 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c - - - ICCARM - 374 - - - BICOMP - 192 - - - __cstat - 67 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c - - - ICCARM - 306 - - - BICOMP - 445 - - - __cstat - 98 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp.c - - - ICCARM 149 BICOMP - 165 - - - __cstat - 146 + 71 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c - - - ICCARM - 430 - - - BICOMP - 168 - - - __cstat - 100 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sdram.c - - - ICCARM - 379 - - - BICOMP - 182 - - - __cstat - 58 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c - - - ICCARM - 396 - - - BICOMP - 183 - - - __cstat - 94 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c - - - ICCARM - 299 - - - BICOMP - 180 - - - __cstat - 89 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -1738,646 +1887,331 @@ ICCARM - 65 + 101 + + + __cstat + 92 BICOMP - 171 + 210 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spi.c + + + ICCARM + 336 + + + __cstat + 52 + + + BICOMP + 177 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hcd.c + + + ICCARM + 361 + + + __cstat + 91 + + + BICOMP + 215 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rng.c + + + ICCARM + 381 + + + __cstat + 377 + + + BICOMP + 100 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard_ex.c + + + ICCARM + 302 __cstat 127 + + BICOMP + 165 + ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_crc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smbus.c ICCARM - 110 + 312 + + + __cstat + 129 BICOMP - 191 + 266 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_jpeg.c + + + ICCARM + 335 __cstat 48 - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_exti.c - - - ICCARM - 383 - BICOMP - 176 - - - __cstat - 346 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dma.c - - - ICCARM - 133 - - - BICOMP - 173 - - - __cstat - 408 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rcc.c - - - ICCARM - 322 - - - BICOMP - 55 - - - __cstat - 51 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cryp_ex.c - - - ICCARM - 155 - - - BICOMP - 424 - - - __cstat - 120 + 420 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd_ex.c - - - ICCARM - 416 - - - BICOMP - 125 - - - __cstat - 362 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_iwdg.c - - - ICCARM - 304 - - - BICOMP - 360 - - - __cstat - 80 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_ltdc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai_ex.c ICCARM 434 - BICOMP - 377 + __cstat + 64 - __cstat - 95 + BICOMP + 213 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rng.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_i2s.c ICCARM - 446 - - - BICOMP - 130 - - - __cstat - 78 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc.c - - - ICCARM - 151 - - - BICOMP - 444 - - - __cstat - 129 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_lptim.c - - - ICCARM - 292 - - - BICOMP - 352 - - - __cstat - 74 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_crc_ex.c - - - ICCARM - 144 - - - BICOMP - 376 - - - __cstat - 112 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_irda.c - - - ICCARM - 300 - - - BICOMP - 116 - - - __cstat - 72 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dma2d.c - - - ICCARM - 43 - - - BICOMP - 443 - - - __cstat - 190 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_cec.c - - - ICCARM - 164 - - - BICOMP - 439 - - - __cstat - 326 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac.c - - - ICCARM - 143 - - - BICOMP - 420 - - - __cstat - 131 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dac_ex.c - - - ICCARM - 137 - - - BICOMP - 447 - - - __cstat - 114 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_pcd.c - - - ICCARM - 449 - - - BICOMP - 119 - - - __cstat - 90 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dcmi_ex.c - - - ICCARM - 46 - - - BICOMP - 181 - - - __cstat - 147 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_nand.c - - - ICCARM - 415 - - - BICOMP - 124 - - - __cstat - 91 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mdios.c - - - ICCARM - 432 - - - BICOMP - 373 - - - __cstat - 82 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c - - - ICCARM - 385 - - - BICOMP - 222 + 290 __cstat 150 + + BICOMP + 186 + ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc_ex.c ICCARM + 388 + + + __cstat 45 BICOMP - 224 - - - __cstat - 106 + 164 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c - - - ICCARM - 163 - - - BICOMP - 178 - - - __cstat - 88 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c - - - ICCARM - 404 - - - BICOMP - 323 - - - __cstat - 142 - - - - - ICCARM - 348 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 21 205 325 12 18 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 249 337 289 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c - - - ICCARM - 384 - - - BICOMP - 69 - - - __cstat - 387 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c - - - ICCARM - 400 - - - BICOMP - 271 - - - __cstat - 341 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sai.c ICCARM 403 - - BICOMP - 140 - __cstat - 410 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c - - - ICCARM - 436 + 106 BICOMP - 172 - - - __cstat - 358 + 190 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_i2c.c + + + ICCARM + 398 + + + __cstat + 151 + + + BICOMP + 201 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_spdifrx.c + + + ICCARM + 375 + + + __cstat + 46 + + + BICOMP + 185 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash.c + + + ICCARM + 374 + + + __cstat + 97 + + + BICOMP + 422 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c + + + ICCARM + 371 + + + __cstat + 39 + + + BICOMP + 161 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -2386,21 +2220,21 @@ ICCARM - 187 - - - BICOMP - 174 + 169 __cstat - 141 + 221 + + + BICOMP + 159 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -2409,38 +2243,151 @@ ICCARM - 334 - - - BICOMP - 64 + 313 __cstat - 402 + 363 + + + BICOMP + 107 + + $PROJ_DIR$\..\stm32f7xx_hal_msp.c + + + ICCARM + 188 + + + __cstat + 125 + + + BICOMP + 247 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + BICOMP + 5 328 12 18 216 27 344 140 288 155 3 2 6 11 0 21 289 17 30 156 10 447 16 32 417 323 175 444 174 433 442 29 339 204 320 357 13 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c + + + ICCARM + 390 + + + __cstat + 197 + + + BICOMP + 172 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c + + + ICCARM + 384 + + + __cstat + 111 + + + BICOMP + 167 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_usb.c ICCARM - 414 - - - BICOMP - 310 + 446 __cstat - 390 + 353 + + + BICOMP + 317 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c + + + ICCARM + 341 + + + __cstat + 53 + + + BICOMP + 162 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_fmc.c + + + ICCARM + 452 + + + __cstat + 409 + + + BICOMP + 181 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 @@ -2452,45 +2399,22 @@ 438 - BICOMP - 311 + __cstat + 121 - __cstat - 56 + BICOMP + 334 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 317 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 291 BICOMP - 307 21 429 37 36 158 317 214 412 454 169 18 205 325 12 3 24 7 16 26 13 17 35 38 296 295 388 19 0 290 316 177 293 433 201 419 28 30 31 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_smartcard.c - - - ICCARM - 397 - - - BICOMP - 185 - - - __cstat - 85 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 339 16 433 10 32 204 291 156 447 417 216 12 140 288 155 18 3 27 2 5 6 11 0 21 328 320 357 13 136 323 289 175 344 444 174 442 17 29 30 @@ -2499,128 +2423,187 @@ ICCARM - 200 - - - BICOMP - 47 + 171 __cstat - 386 + 359 + + + BICOMP + 110 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_adc.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_gpio.c ICCARM + 378 + + + __cstat + 354 + + + BICOMP + 90 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_dfsdm.c + + + ICCARM + 130 + + + __cstat + 55 + + + BICOMP + 281 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_mdios.c + + + ICCARM + 450 + + + __cstat + 38 + + + BICOMP + 400 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_utils.c + + + ICCARM + 379 + + + __cstat + 199 + + + BICOMP + 297 + + + + + ICCARM + 385 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 16 140 288 155 12 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 283 315 343 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_rtc.c + + + ICCARM + 220 + + + __cstat + 51 + + + BICOMP + 183 + + + + + ICCARM + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 + + + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_lptim.c + + + ICCARM + 373 + + + __cstat 368 BICOMP - 197 - - - __cstat - 153 + 103 - $PROJ_DIR$\..\stm32f7xx_hal_msp.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_hash_ex.c ICCARM + 367 + + + __cstat 195 BICOMP - 278 - - - __cstat - 50 + 268 ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - BICOMP - 26 296 18 3 169 7 293 205 325 12 24 16 13 17 35 38 316 28 31 214 37 412 21 36 454 290 177 433 201 429 419 30 307 158 295 388 19 0 + 16 140 288 155 12 10 0 32 417 216 328 175 204 320 344 444 323 433 174 339 289 21 11 447 357 442 156 18 13 3 17 27 2 29 5 30 6 136 - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_usart.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_rtc.c ICCARM - 366 - - - BICOMP - 194 + 358 __cstat - 57 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_sram.c - - - ICCARM - 298 + 299 BICOMP - 184 - - - __cstat - 101 - - - - - ICCARM - 21 205 325 12 18 37 35 36 454 169 296 177 158 295 293 433 290 429 201 307 316 38 17 412 388 419 214 3 19 24 28 7 16 30 26 31 13 0 - - - - - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c - - - ICCARM - 417 - - - BICOMP - 216 - - - __cstat - 407 + 231 @@ -2629,30 +2612,47 @@ ILINK - 381 + 360 OBJCOPY - 313 + 325 ILINK - 356 333 274 418 437 154 136 134 44 59 372 391 365 401 344 409 452 456 435 453 272 370 422 363 392 303 421 354 455 405 + 391 286 229 430 445 211 79 77 158 124 399 369 393 362 303 352 411 412 449 418 252 402 431 401 349 330 455 408 425 355 + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_ll_dac.c + + + ICCARM + 441 + + + __cstat + 351 + + + BICOMP + 180 + + + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_tim_template.c ICCARM - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c ICCARM - $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_alarm_template.c + $PROJ_DIR$\..\lib\STM32F7xx_HAL_Driver\Src\stm32f7xx_hal_timebase_rtc_wakeup_template.c ICCARM diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h index 5de6c6e1..2c47d3f0 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h @@ -12,29 +12,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h index 4209206e..473ff95e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h @@ -125,8 +125,6 @@ typedef struct This parameter can be a value of @ref UART_MSB_First. */ } UART_AdvFeatureInitTypeDef; - - /** * @brief HAL UART State definition * @note HAL UART State value is a combination of 2 different substates: gState and RxState (see @ref UART_State_Definition). @@ -206,10 +204,9 @@ typedef struct __UART_HandleTypeDef uint16_t Mask; /*!< UART Rx RDR register mask */ + void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ + void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ @@ -313,8 +310,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define HAL_UART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_UART_ERROR_RTO ((uint32_t)0x00000020U) /*!< Receiver Timeout error */ + #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000020U) /*!< Invalid Callback error */ +#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000040U) /*!< Invalid Callback error */ #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ /** * @} @@ -400,11 +399,11 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @} */ -/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut +/** @defgroup UART_Receiver_Timeout UART Receiver Timeout * @{ */ -#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART receiver timeout disable */ -#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART receiver timeout enable */ +#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART Receiver Timeout disable */ +#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART Receiver Timeout enable */ /** * @} */ @@ -562,6 +561,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_Stop_Mode_Enable UART Advanced Feature Stop Mode Enable + * @{ + */ +#define UART_ADVFEATURE_STOPMODE_DISABLE 0x00000000U /*!< UART stop mode disable */ +#define UART_ADVFEATURE_STOPMODE_ENABLE USART_CR1_UESM /*!< UART stop mode enable */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_Mute_Mode UART Advanced Feature Mute Mode Enable * @{ @@ -579,6 +589,18 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_WakeUp_from_Stop_Selection UART WakeUp From Stop Selection + * @{ + */ +#define UART_WAKEUP_ON_ADDRESS 0x00000000U /*!< UART wake-up on address */ +#define UART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< UART wake-up on start bit */ +#define UART_WAKEUP_ON_READDATA_NONEMPTY USART_CR3_WUS /*!< UART wake-up on receive data register not empty or RXFIFO is not empty */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_DriverEnable_Polarity UART DriverEnable Polarity * @{ @@ -626,13 +648,20 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * - 0xXXXX : Flag mask in the ISR register * @{ */ +#if defined(USART_ISR_REACK) +#define UART_FLAG_REACK USART_ISR_REACK /*!< UART receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #define UART_FLAG_TEACK USART_ISR_TEACK /*!< UART transmit enable acknowledge flag */ +#if defined(USART_CR1_UESM) +#define UART_FLAG_WUF USART_ISR_WUF /*!< UART wake-up from stop mode flag */ +#endif /* USART_CR1_UESM */ #define UART_FLAG_RWU USART_ISR_RWU /*!< UART receiver wake-up from mute mode flag */ #define UART_FLAG_SBKF USART_ISR_SBKF /*!< UART send break flag */ #define UART_FLAG_CMF USART_ISR_CMF /*!< UART character match flag */ #define UART_FLAG_BUSY USART_ISR_BUSY /*!< UART busy flag */ #define UART_FLAG_ABRF USART_ISR_ABRF /*!< UART auto Baud rate flag */ #define UART_FLAG_ABRE USART_ISR_ABRE /*!< UART auto Baud rate error */ +#define UART_FLAG_RTOF USART_ISR_RTOF /*!< UART receiver timeout flag */ #define UART_FLAG_CTS USART_ISR_CTS /*!< UART clear to send flag */ #define UART_FLAG_CTSIF USART_ISR_CTSIF /*!< UART clear to send interrupt flag */ #define UART_FLAG_LBDF USART_ISR_LBDF /*!< UART LIN break detection flag */ @@ -674,6 +703,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define UART_IT_LBD 0x0846U /*!< UART LIN break detection interruption */ #define UART_IT_CTS 0x096AU /*!< UART CTS interruption */ #define UART_IT_CM 0x112EU /*!< UART character match interruption */ +#if defined(USART_CR1_UESM) +#define UART_IT_WUF 0x1476U /*!< UART wake-up from stop mode interruption */ +#endif /* USART_CR1_UESM */ +#define UART_IT_RTO 0x0B3AU /*!< UART receiver timeout interruption */ #define UART_IT_ERR 0x0060U /*!< UART error interruption */ @@ -689,13 +722,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define UART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ #define UART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ +#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ #define UART_CLEAR_OREF USART_ICR_ORECF /*!< Overrun Error Clear Flag */ #define UART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ #define UART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ #define UART_CLEAR_LBDF USART_ICR_LBDCF /*!< LIN Break Detection Clear Flag */ #define UART_CLEAR_CTSF USART_ICR_CTSCF /*!< CTS Interrupt Clear Flag */ #define UART_CLEAR_CMF USART_ICR_CMCF /*!< Character Match Clear Flag */ +#if defined(USART_CR1_UESM) +#define UART_CLEAR_WUF USART_ICR_WUCF /*!< Wake Up from stop mode Clear Flag */ +#endif /* USART_CR1_UESM */ +#define UART_CLEAR_RTOF USART_ICR_RTOCF /*!< UART receiver timeout clear flag */ /** * @} */ @@ -734,9 +771,9 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) \ do{ \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ - } while(0U) + SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ + SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ + } while(0U) /** @brief Clear the specified UART pending flag. * @param __HANDLE__ specifies the UART Handle. @@ -748,9 +785,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver Timeout clear flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag +#if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) @@ -790,7 +831,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __FLAG__ specifies the flag to check. * This parameter can be one of the following values: +#if defined(USART_ISR_REACK) + * @arg @ref UART_FLAG_REACK Receive enable acknowledge flag +#endif * @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_FLAG_WUF Wake up from stop mode flag + #endif * @arg @ref UART_FLAG_RWU Receiver wake up flag (if the UART in mute mode) * @arg @ref UART_FLAG_SBKF Send Break flag * @arg @ref UART_FLAG_CMF Character match flag @@ -802,6 +849,7 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_FLAG_TXE Transmit data register empty flag * @arg @ref UART_FLAG_TC Transmission Complete flag * @arg @ref UART_FLAG_RXNE Receive data register not empty flag + * @arg @ref UART_FLAG_RTOF Receiver Timeout flag * @arg @ref UART_FLAG_IDLE Idle Line detection flag * @arg @ref UART_FLAG_ORE Overrun Error flag * @arg @ref UART_FLAG_NE Noise Error flag @@ -815,12 +863,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to enable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (frame error, noise error, overrun error) @@ -835,12 +887,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to disable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) @@ -854,37 +910,46 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ -#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) +#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\ + & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) /** @brief Check whether the specified UART interrupt source is enabled or not. * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ #define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U) ? (__HANDLE__)->Instance->CR1 : \ - (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ - (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) + (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ + (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) /** @brief Clear the specified UART ISR flag, in setting the proper ICR register flag. * @param __HANDLE__ specifies the UART Handle. @@ -896,10 +961,14 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_NEF Noise detected Clear Flag * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver timeout clear flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) @@ -1083,10 +1152,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid) */ #define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__)\ - (((__CONTROL__) == UART_HWCONTROL_NONE) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS) || \ - ((__CONTROL__) == UART_HWCONTROL_CTS) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) + (((__CONTROL__) == UART_HWCONTROL_NONE) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS) || \ + ((__CONTROL__) == UART_HWCONTROL_CTS) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) /** * @brief Ensure that UART communication mode is valid. @@ -1134,8 +1203,15 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __TIMEOUT__ UART receiver timeout setting. * @retval SET (__TIMEOUT__ is valid) or RESET (__TIMEOUT__ is invalid) */ -#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ - ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) +#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ + ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) + +/** @brief Check the receiver timeout value. + * @note The maximum UART receiver timeout value is 0xFFFFFF. + * @param __TIMEOUTVALUE__ receiver timeout value. + * @retval Test result (TRUE or FALSE) + */ +#define IS_UART_RECEIVER_TIMEOUT_VALUE(__TIMEOUTVALUE__) ((__TIMEOUTVALUE__) <= 0xFFFFFFU) /** * @brief Ensure that UART LIN state is valid. @@ -1275,6 +1351,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define IS_UART_ADVFEATURE_MSBFIRST(__MSBFIRST__) (((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_DISABLE) || \ ((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_ENABLE)) +#if defined(USART_CR1_UESM) +/** + * @brief Ensure that UART stop mode state is valid. + * @param __STOPMODE__ UART stop mode state. + * @retval SET (__STOPMODE__ is valid) or RESET (__STOPMODE__ is invalid) + */ +#define IS_UART_ADVFEATURE_STOPMODE(__STOPMODE__) (((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_DISABLE) || \ + ((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_ENABLE)) + +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART mute mode state is valid. * @param __MUTE__ UART mute mode state. @@ -1282,6 +1368,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define IS_UART_MUTE_MODE(__MUTE__) (((__MUTE__) == UART_ADVFEATURE_MUTEMODE_DISABLE) || \ ((__MUTE__) == UART_ADVFEATURE_MUTEMODE_ENABLE)) +#if defined(USART_CR1_UESM) + +/** + * @brief Ensure that UART wake-up selection is valid. + * @param __WAKE__ UART wake-up selection. + * @retval SET (__WAKE__ is valid) or RESET (__WAKE__ is invalid) + */ +#define IS_UART_WAKEUP_SELECTION(__WAKE__) (((__WAKE__) == UART_WAKEUP_ON_ADDRESS) || \ + ((__WAKE__) == UART_WAKEUP_ON_STARTBIT) || \ + ((__WAKE__) == UART_WAKEUP_ON_READDATA_NONEMPTY)) +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART driver enable polarity is valid. @@ -1320,7 +1417,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -1369,6 +1467,10 @@ void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); */ /* Peripheral Control functions ************************************************/ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue); +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart); + HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart); @@ -1405,7 +1507,8 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart); HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart); -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); void UART_AdvFeatureConfig(UART_HandleTypeDef *huart); /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h index a5907f57..866a490f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h @@ -41,7 +41,24 @@ extern "C" { * @{ */ +#if defined(USART_CR1_UESM) +/** + * @brief UART wake up from stop mode parameters + */ +typedef struct +{ + uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF). + This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection. + If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must + be filled up. */ + uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long. + This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */ + + uint8_t Address; /*!< UART/USART node address (7-bit long max). */ +} UART_WakeUpTypeDef; + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -54,9 +71,9 @@ extern "C" { /** @defgroup UARTEx_Word_Length UARTEx Word Length * @{ */ -#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ -#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ -#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ +#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ +#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ +#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ /** * @} */ @@ -64,13 +81,12 @@ extern "C" { /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length * @{ */ -#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ -#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ +#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ +#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ /** * @} */ - /** * @} */ @@ -86,7 +102,8 @@ extern "C" { */ /* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime); +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime); /** * @} @@ -96,6 +113,10 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @{ */ +#if defined(USART_CR1_UESM) +void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart); + +#endif /* USART_CR1_UESM */ /** * @} @@ -106,8 +127,20 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, */ /* Peripheral Control functions **********************************************/ +#if defined(USART_CR1_UESM) +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart); + +#endif/* USART_CR1_UESM */ +#if defined(USART_CR3_UCESM) +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart); + +#endif /* USART_CR3_UCESM */ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength); + /** * @} */ @@ -126,12 +159,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua * @param __CLOCKSOURCE__ output variable. * @retval UART clocking source, written in __CLOCKSOURCE__. */ -#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ +#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ do { \ if((__HANDLE__)->Instance == USART1) \ { \ - switch(__HAL_RCC_GET_USART1_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART1_SOURCE()) \ + { \ case RCC_USART1CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -147,12 +180,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART2) \ { \ - switch(__HAL_RCC_GET_USART2_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART2_SOURCE()) \ + { \ case RCC_USART2CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -168,12 +201,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART3) \ { \ - switch(__HAL_RCC_GET_USART3_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART3_SOURCE()) \ + { \ case RCC_USART3CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -189,12 +222,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == UART4) \ { \ - switch(__HAL_RCC_GET_UART4_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART4_SOURCE()) \ + { \ case RCC_UART4CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -210,12 +243,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART5) \ { \ - switch(__HAL_RCC_GET_UART5_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART5_SOURCE()) \ + { \ case RCC_UART5CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -231,12 +264,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART6) \ { \ - switch(__HAL_RCC_GET_USART6_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART6_SOURCE()) \ + { \ case RCC_USART6CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -252,12 +285,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART7) \ { \ - switch(__HAL_RCC_GET_UART7_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART7_SOURCE()) \ + { \ case RCC_UART7CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -273,12 +306,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART8) \ { \ - switch(__HAL_RCC_GET_UART8_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART8_SOURCE()) \ + { \ case RCC_UART8CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -294,7 +327,7 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else \ { \ @@ -313,44 +346,44 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua */ #define UART_MASK_COMPUTATION(__HANDLE__) \ do { \ - if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x01FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x003FU ; \ - } \ - } \ - else \ - { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ -} while(0U) + } \ + } \ + else \ + { \ + (__HANDLE__)->Mask = 0x0000U; \ + } \ + } while(0U) /** * @brief Ensure that UART frame length is valid. @@ -369,7 +402,6 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \ ((__ADDRESS__) == UART_ADDRESS_DETECT_7B)) - /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c index 76efbf84..25a901fe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c @@ -326,7 +326,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -346,7 +345,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -393,7 +391,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -416,7 +413,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -481,7 +477,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -507,7 +502,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe /* Set the USART LIN Break detection length. */ MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -567,7 +561,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -596,7 +589,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add /* Set the wake up method by setting the WAKE bit in the CR1 register */ MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -622,7 +614,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); huart->Instance->CR1 = 0x0U; @@ -645,7 +636,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_RESET; huart->RxState = HAL_UART_STATE_RESET; - /* Process Unlock */ __HAL_UNLOCK(huart); return HAL_OK; @@ -704,18 +694,18 @@ __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) * @param pCallback pointer to the Callback function * @retval HAL status */ -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; if (pCallback == NULL) { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; return HAL_ERROR; } - /* Process locked */ + __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_READY) @@ -768,10 +758,8 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -789,24 +777,19 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -837,7 +820,6 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR { HAL_StatusTypeDef status = HAL_OK; - /* Process locked */ __HAL_LOCK(huart); if (HAL_UART_STATE_READY == huart->gState) @@ -876,6 +858,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ break; +#if defined(USART_CR1_UESM) + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + break; + +#endif /* USART_CR1_UESM */ case HAL_UART_MSPINIT_CB_ID : huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ break; @@ -885,10 +873,8 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -906,24 +892,19 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -992,6 +973,11 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR (+) HAL_UART_AbortCpltCallback() (+) HAL_UART_AbortTransmitCpltCallback() (+) HAL_UART_AbortReceiveCpltCallback() +#if defined(USART_CR1_UESM) + + (#) Wakeup from Stop mode Callback: + (+) HAL_UARTEx_WakeupCallback() +#endif (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. Errors are handled as follows : @@ -1013,9 +999,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR /** * @brief Send an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1033,7 +1022,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1045,7 +1033,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u huart->TxXferSize = Size; huart->TxXferCount = Size; - /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { pdata8bits = NULL; @@ -1057,6 +1045,8 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u pdata16bits = NULL; } + __HAL_UNLOCK(huart); + while (huart->TxXferCount > 0U) { if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) @@ -1084,9 +1074,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /* At end of Tx process, restore huart->gState to Ready */ huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1097,9 +1084,12 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /** * @brief Receive an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1118,7 +1108,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1146,6 +1135,8 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui pdata16bits = NULL; } + __HAL_UNLOCK(huart); + /* as long as data have to be received */ while (huart->RxXferCount > 0U) { @@ -1169,9 +1160,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /* At end of Rx process, restore huart->RxState to Ready */ huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1182,9 +1170,12 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /** * @brief Send an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1197,7 +1188,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1218,7 +1208,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData huart->TxISR = UART_TxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the Transmit Data Register Empty interrupt */ @@ -1234,9 +1223,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData /** * @brief Receive an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1249,7 +1241,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1276,7 +1267,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, huart->RxISR = UART_RxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ @@ -1292,9 +1282,12 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, /** * @brief Send an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1307,7 +1300,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1337,7 +1329,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1349,7 +1340,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Clear the TC flag in the ICR register */ __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF); - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the DMA transfer for transmit request by setting the DMAT bit @@ -1368,9 +1358,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat * @brief Receive an amount of data in DMA mode. * @note When the UART parity is enabled (PCE = 1), the received data contain * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1383,7 +1376,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1412,7 +1404,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1421,7 +1412,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error Interrupt */ @@ -1452,7 +1442,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) const HAL_UART_StateTypeDef gstate = huart->gState; const HAL_UART_StateTypeDef rxstate = huart->RxState; - /* Process Locked */ __HAL_LOCK(huart); if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && @@ -1472,7 +1461,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1485,7 +1473,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_BUSY_TX) @@ -1506,7 +1493,6 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1591,7 +1577,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) { /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1663,7 +1649,6 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Reset Handle ErrorCode to No Error */ huart->ErrorCode = HAL_UART_ERROR_NONE; return HAL_OK; @@ -1680,7 +1665,7 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) { /* Disable TXEIE and TCIE interrupts */ @@ -1732,7 +1717,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1792,7 +1777,7 @@ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) { uint32_t abortcplt = 1U; @@ -1931,7 +1916,7 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) { /* Disable interrupts */ @@ -2015,7 +2000,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -2110,7 +2095,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) uint32_t errorcode; /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE)); + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); if (errorflags == 0U) { /* UART in mode Receiver ---------------------------------------------------*/ @@ -2164,10 +2149,18 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) huart->ErrorCode |= HAL_UART_ERROR_ORE; } - /* Call UART Error Call back function if need be --------------------------*/ + /* UART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + huart->ErrorCode |= HAL_UART_ERROR_RTO; + } + + /* Call UART Error Call back function if need be ----------------------------*/ if (huart->ErrorCode != HAL_UART_ERROR_NONE) { - /* UART in mode Receiver ---------------------------------------------------*/ + /* UART in mode Receiver --------------------------------------------------*/ if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U)) { @@ -2177,11 +2170,14 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) } } - /* If Overrun error occurs, or if any error occurs in DMA mode reception, - consider error as blocking */ + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ errorcode = huart->ErrorCode; if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) || - ((errorcode & HAL_UART_ERROR_ORE) != 0U)) + ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U)) { /* Blocking error : transfer is aborted Set the UART state ready to be able to start again the process, @@ -2249,6 +2245,26 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) return; } /* End if some error occurs */ +#if defined(USART_CR1_UESM) + + /* UART wakeup from Stop mode interrupt occurred ---------------------------*/ + if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF); + + /* UART Rx state is not reset as a reception process might be ongoing. + If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Wakeup Callback */ + huart->WakeupCallback(huart); +#else + /* Call legacy weak Wakeup Callback */ + HAL_UARTEx_WakeupCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } +#endif /* USART_CR1_UESM */ /* UART in mode Transmitter ------------------------------------------------*/ if (((isrflags & USART_ISR_TXE) != 0U) @@ -2390,6 +2406,23 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ } +#if defined(USART_CR1_UESM) +/** + * @brief UART wakeup from Stop mode callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_WakeupCallback can be implemented in the user file. + */ +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2403,6 +2436,9 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) =============================================================================== [..] This subsection provides a set of functions allowing to control the UART. + (+) HAL_UART_ReceiverTimeout_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_UART_EnableReceiverTimeout() API enables the receiver timeout feature + (+) HAL_UART_DisableReceiverTimeout() API disables the receiver timeout feature (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode @@ -2416,6 +2452,82 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) * @{ */ +/** + * @brief Update on the fly the receiver timeout value in RTOR register. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param TimeoutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue) +{ + assert_param(IS_UART_RECEIVER_TIMEOUT_VALUE(TimeoutValue)); + MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, TimeoutValue); +} + +/** + * @brief Enable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + /** * @brief Enable UART in mute mode (does not mean UART enters mute mode; * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called). @@ -2424,7 +2536,6 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2445,7 +2556,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2476,7 +2586,6 @@ void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2488,7 +2597,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2501,7 +2609,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2513,7 +2620,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2530,7 +2636,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) /* Check the parameters */ assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2540,7 +2645,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2551,8 +2655,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ /** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions - * @brief UART Peripheral State functions - * + * @brief UART Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State and Error functions ##### @@ -2574,7 +2678,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) { - uint32_t temp1, temp2; + uint32_t temp1; + uint32_t temp2; temp1 = huart->gState; temp2 = huart->RxState; @@ -2586,7 +2691,7 @@ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART. * @retval UART Error Code -*/ + */ uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) { return huart->ErrorCode; @@ -2620,6 +2725,9 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ +#if defined(USART_CR1_UESM) + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ +#endif /* USART_CR1_UESM */ } #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -2636,6 +2744,7 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) UART_ClockSourceTypeDef clocksource; uint32_t usartdiv = 0x00000000U; HAL_StatusTypeDef ret = HAL_OK; + uint32_t pclk; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); @@ -2683,21 +2792,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2720,21 +2831,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2858,12 +2971,24 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) return HAL_TIMEOUT; } } +#if defined(USART_ISR_REACK) + + /* Check if the Receiver is enabled */ + if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } +#endif /* Initialize the UART State */ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2878,7 +3003,8 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) * @param Timeout Timeout duration * @retval HAL status */ -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) @@ -2895,11 +3021,32 @@ HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_TIMEOUT; } + + if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET) + { + /* Clear Receiver Timeout flag*/ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ + CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); + CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ErrorCode = HAL_UART_ERROR_RTO; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } } } return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c index 415fb56b..fcbcf4fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c @@ -57,6 +57,9 @@ /** @defgroup UARTEx_Private_Functions UARTEx Private Functions * @{ */ +#if defined(USART_CR1_UESM) +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +#endif /* USART_CR1_UESM */ /** * @} */ @@ -144,7 +147,8 @@ * oversampling rate). * @retval HAL status */ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime) +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime) { uint32_t temp; @@ -224,42 +228,74 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @} */ -/** @defgroup UARTEx_Exported_Functions_Group2 IO operation functions - * @brief Extended functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of Wakeup and FIFO mode related callback functions. - -@endverbatim - * @{ - */ - - -/** - * @} - */ /** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions * @brief Extended Peripheral Control functions - * + * @verbatim =============================================================================== ##### Peripheral Control functions ##### =============================================================================== [..] This section provides the following functions: + (+) HAL_UARTEx_EnableClockStopMode() API enables the UART clock (HSI or LSE only) during stop mode + (+) HAL_UARTEx_DisableClockStopMode() API disables the above functionality (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address detection length to more than 4 bits for multiprocessor address mark wake up. +#if defined(USART_CR1_UESM) + (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode + trigger: address match, Start Bit detection or RXNE bit status. + (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode + (+) HAL_UARTEx_DisableStopMode() API disables the above functionality +#endif @endverbatim * @{ */ +#if defined(USART_CR3_UCESM) +/** + * @brief Keep UART Clock enabled when in Stop Mode. + * @note When the USART clock source is configured to be LSE or HSI, it is possible to keep enabled + * this clock during STOP mode by setting the UCESM bit in USART_CR3 control register. + * @note When LPUART is used to wakeup from stop with LSE is selected as LPUART clock source, + * and desired baud rate is 9600 baud, the bit UCESM bit in LPUART_CR3 control register must be set. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + /* Set UCESM bit */ + SET_BIT(huart->Instance->CR3, USART_CR3_UCESM); + /* Process Unlocked */ + __HAL_UNLOCK(huart); + return HAL_OK; +} + +/** + * @brief Disable UART Clock when in Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UCESM bit */ + CLEAR_BIT(huart->Instance->CR3, USART_CR3_UCESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR3_UCESM */ /** * @brief By default in multiprocessor mode, when the wake up method is set * to address mark, the UART handles only 4-bit long addresses detection; @@ -299,8 +335,108 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua return (UART_CheckIdleState(huart)); } +#if defined(USART_CR1_UESM) +/** + * @brief Set Wakeup from Stop mode interrupt flag selection. + * @note It is the application responsibility to enable the interrupt used as + * usart_wkup interrupt source before entering low-power mode. + * @param huart UART handle. + * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUP_ON_ADDRESS + * @arg @ref UART_WAKEUP_ON_STARTBIT + * @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + /* check the wake-up from stop mode UART instance */ + assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); + /* check the wake-up selection parameter */ + assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the wake-up selection scheme */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); + + if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) + { + UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); + } + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* Init tickstart for timeout managment*/ + tickstart = HAL_GetTick(); + + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + status = HAL_TIMEOUT; + } + else + { + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Enable UART Stop Mode. + * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set UESM bit */ + SET_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable UART Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UESM bit */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -312,6 +448,25 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua /** @addtogroup UARTEx_Private_Functions * @{ */ +#if defined(USART_CR1_UESM) + +/** + * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. + * @param huart UART handle. + * @param WakeUpSelection UART wake up from stop mode parameters. + * @retval None + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); + + /* Set the USART address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); + + /* Set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); +} +#endif /* USART_CR1_UESM */ /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_IAR/Prog/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.axf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/bin/openblt_stm32f746.axf index 7aed20ccf7e2865631980d198b2718e8aef5c5b5..192366cea3394cbdcb81f362cb85fca6978a00ec 100644 GIT binary patch literal 2574116 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�ZZxZg&B$8p3zl|CL8o$t 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

FQdkv!g@tp4KzFHEqNN;Gtt(sw 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

rdX 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

c6QgIMqSD>qDvc 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%0ATGZhDcL$m8Kh@YkuvK`F0YJ~{a@;V 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

© COPYRIGHT(c) 2016 STMicroelectronics
+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

DKq!babY9)7+?N)l!?|) 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 A+q?pdlkG=Ug?lbJBNZ$f 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%0D6_g#fphs!v+FCKJrlND_S(TW~#Zu1vX? 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

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h index 0633bb22..2650b739 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h @@ -96,16 +96,16 @@ typedef struct __PCD_HandleTypeDef typedef struct #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ { - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ uint32_t BESL; @@ -148,9 +148,9 @@ typedef struct /** @defgroup PCD_Speed PCD Speed * @{ */ -#define PCD_SPEED_HIGH 0U -#define PCD_SPEED_HIGH_IN_FULL 1U -#define PCD_SPEED_FULL 2U +#define PCD_SPEED_HIGH USBD_HS_SPEED +#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED +#define PCD_SPEED_FULL USBD_FS_SPEED /** * @} */ @@ -207,20 +207,20 @@ typedef struct #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ } while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ } while(0U) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -256,7 +256,7 @@ typedef enum HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ @@ -371,14 +371,6 @@ PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); * @{ */ #if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - #define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ #define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h index f151a3d3..9bbccb71 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h @@ -42,13 +42,6 @@ extern "C" { /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_LL_Private_Constants USART Private Constants - * @{ - */ -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ #if defined(USE_FULL_LL_DRIVER) /** @defgroup USART_LL_Private_Macros USART Private Macros @@ -156,18 +149,21 @@ typedef struct */ #define LL_USART_ICR_PECF USART_ICR_PECF /*!< Parity error flag */ #define LL_USART_ICR_FECF USART_ICR_FECF /*!< Framing error flag */ -#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ +#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ #define LL_USART_ICR_ORECF USART_ICR_ORECF /*!< Overrun error flag */ #define LL_USART_ICR_IDLECF USART_ICR_IDLECF /*!< Idle line detected flag */ #define LL_USART_ICR_TCCF USART_ICR_TCCF /*!< Transmission complete flag */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ICR_TCBGTCF USART_ICR_TCBGTCF /*!< Transmission completed before guard time flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ #define LL_USART_ICR_LBDCF USART_ICR_LBDCF /*!< LIN break detection flag */ #define LL_USART_ICR_CTSCF USART_ICR_CTSCF /*!< CTS flag */ #define LL_USART_ICR_RTOCF USART_ICR_RTOCF /*!< Receiver timeout flag */ #define LL_USART_ICR_EOBCF USART_ICR_EOBCF /*!< End of block flag */ #define LL_USART_ICR_CMCF USART_ICR_CMCF /*!< Character match flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ICR_WUCF USART_ICR_WUCF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ /** * @} */ @@ -195,10 +191,16 @@ typedef struct #define LL_USART_ISR_CMF USART_ISR_CMF /*!< Character match flag */ #define LL_USART_ISR_SBKF USART_ISR_SBKF /*!< Send break flag */ #define LL_USART_ISR_RWU USART_ISR_RWU /*!< Receiver wakeup from Mute mode flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ISR_WUF USART_ISR_WUF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ #define LL_USART_ISR_TEACK USART_ISR_TEACK /*!< Transmit enable acknowledge flag */ +#if defined(USART_ISR_REACK) +#define LL_USART_ISR_REACK USART_ISR_REACK /*!< Receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ISR_TCBGT USART_ISR_TCBGT /*!< Transmission complete before guard time completion flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -218,9 +220,12 @@ typedef struct #define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ #define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ #define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +#if defined(USART_CR1_UESM) +#define LL_USART_CR3_WUFIE USART_CR3_WUFIE /*!< Wakeup from Stop mode interrupt enable */ +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_CR3_TCBGTIE USART_CR3_TCBGTIE /*!< Transmission complete before guard time interrupt enable */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -400,6 +405,18 @@ typedef struct * @} */ +#if defined(USART_CR1_UESM) +/** @defgroup USART_LL_EC_WAKEUP_ON Wakeup Activation + * @{ + */ +#define LL_USART_WAKEUP_ON_ADDRESS 0x00000000U /*!< Wake up active on address match */ +#define LL_USART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< Wake up active on Start bit detection */ +#define LL_USART_WAKEUP_ON_RXNE (USART_CR3_WUS_0 | USART_CR3_WUS_1) /*!< Wake up active on RXNE */ +/** + * @} + */ + +#endif /* USART_CR1_UESM */ /** @defgroup USART_LL_EC_IRDA_POWER IrDA Power * @{ */ @@ -480,7 +497,8 @@ typedef struct * @param __BAUDRATE__ Baud rate value to achieve * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case */ -#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U) + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U)\ + + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) /** * @brief Compute USARTDIV value according to Peripheral Clock and @@ -545,6 +563,87 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief USART enabled in STOP Mode. + * @note When this function is enabled, USART is able to wake up the MCU from Stop mode, provided that + * USART clock selection is HSI or LSE in RCC. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_EnableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief USART disabled in STOP Mode. + * @note When this function is disabled, USART is not able to wake up the MCU from Stop mode + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_DisableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief Indicate if USART is enabled in STOP Mode (able to wake up MCU from Stop mode or not) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_IsEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledInStopMode(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR1, USART_CR1_UESM) == (USART_CR1_UESM)) ? 1UL : 0UL); +} + +#if defined(USART_CR3_UCESM) +/** + * @brief USART Clock enabled in STOP Mode + * @note When this function is called, USART Clock is enabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_EnableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableClockInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief USART clock disabled in STOP Mode + * @note When this function is called, USART Clock is disabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_DisableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableClockInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief Indicate if USART clock is enabled in STOP Mode + * @rmtoll CR3 UCESM LL_USART_IsClockEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsClockEnabledInStopMode(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_UCESM) == (USART_CR3_UCESM)); +} + +#endif /* USART_CR3_UCESM */ +#endif /* USART_CR1_UESM*/ /** * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) * @rmtoll CR1 RE LL_USART_EnableDirectionRx @@ -1461,6 +1560,41 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_OVRDIS) != USART_CR3_OVRDIS) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Select event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_SetWKUPType + * @param USARTx USART Instance + * @param Type This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWKUPType(USART_TypeDef *USARTx, uint32_t Type) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_WUS, Type); +} + +/** + * @brief Return event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_GetWKUPType + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + */ +__STATIC_INLINE uint32_t LL_USART_GetWKUPType(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_WUS)); +} + +#endif /* USART_CR1_UESM */ /** * @brief Configure USART BRR register for achieving expected Baud Rate value. * @note Compute and set USARTDIV value in BRR Register (full BRR content) @@ -1480,7 +1614,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) __STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate) { - register uint32_t usartdiv; + uint32_t usartdiv; register uint32_t brrtemp; if (OverSampling == LL_USART_OVERSAMPLING_8) @@ -2161,7 +2295,8 @@ __STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) { /* In Asynchronous mode, the following bits must be kept cleared: - LINEN, CLKEN bits in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); } @@ -2197,7 +2332,8 @@ __STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) { /* In Synchronous mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); /* set the UART/USART in Synchronous mode */ @@ -2237,7 +2373,8 @@ __STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) { /* In LIN mode, the following bits must be kept cleared: - STOP and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); /* Set the UART/USART in LIN mode */ @@ -2275,7 +2412,8 @@ __STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) { /* In Half Duplex mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ + - SCEN and IREN bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); /* set the UART/USART in Half Duplex mode */ @@ -2315,7 +2453,8 @@ __STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) { /* In Smartcard mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - IREN and HDSEL bits in the USART_CR3 register.*/ + - IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); /* Configure Stop bits to 1.5 bits */ @@ -2358,7 +2497,8 @@ __STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) { /* In IRDA mode, the following bits must be kept cleared: - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ + - SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); /* set the UART/USART in IRDA mode */ @@ -2396,7 +2536,8 @@ __STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) { /* In Multi Processor mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); } @@ -2630,6 +2771,21 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_RWU) == (USART_ISR_RWU)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from stop mode Flag is set or not + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ISR WUF LL_USART_IsActiveFlag_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_WUF) == (USART_ISR_WUF)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ /** * @brief Check if the USART Transmit Enable Acknowledge Flag is set or not * @rmtoll ISR TEACK LL_USART_IsActiveFlag_TEACK @@ -2641,6 +2797,19 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TEACK(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_TEACK) == (USART_ISR_TEACK)) ? 1UL : 0UL); } +#if defined(USART_ISR_REACK) +/** + * @brief Check if the USART Receive Enable Acknowledge Flag is set or not + * @rmtoll ISR REACK LL_USART_IsActiveFlag_REACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_REACK(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_REACK) == (USART_ISR_REACK)) ? 1UL : 0UL); +} + +#endif/* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2653,8 +2822,8 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->ISR, USART_ISR_TCBGT) == (USART_ISR_TCBGT)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear Parity Error Flag * @rmtoll ICR PECF LL_USART_ClearFlag_PE @@ -2733,7 +2902,7 @@ __STATIC_INLINE void LL_USART_ClearFlag_TCBGT(USART_TypeDef *USARTx) { WRITE_REG(USARTx->ICR, USART_ICR_TCBGTCF); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear LIN Break Detection Flag @@ -2796,6 +2965,21 @@ __STATIC_INLINE void LL_USART_ClearFlag_CM(USART_TypeDef *USARTx) WRITE_REG(USARTx->ICR, USART_ICR_CMCF); } +#if defined(USART_CR1_UESM) +/** + * @brief Clear Wake Up from stop mode Flag + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ICR WUCF LL_USART_ClearFlag_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_WKUP(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->ICR, USART_ICR_WUCF); +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2935,6 +3119,21 @@ __STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) SET_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Enable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_EnableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_WKUP(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2949,7 +3148,7 @@ __STATIC_INLINE void LL_USART_EnableIT_TCBGT(USART_TypeDef *USARTx) { SET_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Disable IDLE Interrupt @@ -3082,6 +3281,21 @@ __STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Disable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_DisableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_WKUP(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3096,7 +3310,7 @@ __STATIC_INLINE void LL_USART_DisableIT_TCBGT(USART_TypeDef *USARTx) { CLEAR_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Check if the USART IDLE Interrupt source is enabled or disabled. @@ -3225,6 +3439,21 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from Stop Mode Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_IsEnabledIT_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR3, USART_CR3_WUFIE) == (USART_CR3_WUFIE)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3239,7 +3468,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->CR3, USART_CR3_TCBGTIE) == (USART_CR3_TCBGTIE)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} @@ -3365,12 +3594,12 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t if (Direction == LL_USART_DMA_REG_DATA_TRANSMIT) { /* return address of TDR register */ - data_reg_addr = (uint32_t) & (USARTx->TDR); + data_reg_addr = (uint32_t) &(USARTx->TDR); } else { /* return address of RDR register */ - data_reg_addr = (uint32_t) & (USARTx->RDR); + data_reg_addr = (uint32_t) &(USARTx->RDR); } return data_reg_addr; @@ -3392,7 +3621,7 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t */ __STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) { - return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR)); + return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR) & 0xFFU); } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h index 1f768abf..44bf4853 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h @@ -155,7 +155,7 @@ typedef struct typedef struct { - uint8_t dev_addr ; /*!< USB device address. + uint8_t dev_addr; /*!< USB device address. This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ uint8_t ch_num; /*!< Host channel number. @@ -199,10 +199,10 @@ typedef struct uint32_t ErrCnt; /*!< Host channel error count.*/ - USB_OTG_URBStateTypeDef urb_state; /*!< URB state. + USB_OTG_URBStateTypeDef urb_state; /*!< URB state. This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ - USB_OTG_HCStateTypeDef state; /*!< Host Channel state. + USB_OTG_HCStateTypeDef state; /*!< Host Channel state. This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ } USB_OTG_HCTypeDef; #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -234,6 +234,18 @@ typedef struct * @} */ +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_HS_SPEED 0U +#define USBD_HSINFS_SPEED 1U +#define USBH_HS_SPEED 0U +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + /** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed * @{ */ @@ -252,7 +264,7 @@ typedef struct #define USB_OTG_HS_EMBEDDED_PHY 3U #if !defined (USB_HS_PHYC_TUNE_VALUE) -#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ +#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ #endif /* USB_HS_PHYC_TUNE_VALUE */ /** * @} @@ -262,11 +274,11 @@ typedef struct * @{ */ #ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U +#define USBD_HS_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ #ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ /** * @} @@ -275,9 +287,9 @@ typedef struct /** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS * @{ */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U +#define USB_OTG_HS_MAX_PACKET_SIZE 512U +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U /** * @} */ @@ -287,7 +299,6 @@ typedef struct */ #define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) #define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_LS_PHY_6MHZ (2U << 1) #define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) /** * @} @@ -397,7 +408,7 @@ typedef struct #define USBPHYC ((USBPHYC_GlobalTypeDef *)((uint32_t )USB_PHY_HS_CONTROLLER_BASE)) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#define EP_ADDR_MSK 0xFU +#define EP_ADDR_MSK 0xFU /** * @} */ @@ -462,13 +473,9 @@ HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state); uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx); uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c index 2b4a5eff..ea532df6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c @@ -122,6 +122,7 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint */ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) { + USB_OTG_GlobalTypeDef *USBx; uint8_t i; /* Check the PCD handle allocation */ @@ -133,6 +134,8 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) /* Check the parameters */ assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + USBx = hpcd->Instance; + if (hpcd->State == HAL_PCD_STATE_RESET) { /* Allocate lock resource and initialize it */ @@ -166,6 +169,12 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) hpcd->State = HAL_PCD_STATE_BUSY; + /* Disable DMA mode for FS instance */ + if ((USBx->CID & (0x1U << 8)) == 0U) + { + hpcd->Init.dma_enable = 0U; + } + /* Disable the Interrupts */ __HAL_PCD_DISABLE(hpcd); @@ -943,7 +952,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i, ep_intr, epint, epnum = 0U; + uint32_t i, ep_intr, epint, epnum; uint32_t fifoemptymsk, temp; USB_OTG_EPTypeDef *ep; @@ -962,6 +971,38 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); } + /* Handle RxQLevel Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + temp = USBx->GRXSTSP; + + ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(USBx, ep->xfer_buff, + (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + else + { + /* ... */ + } + USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) { epnum = 0U; @@ -983,9 +1024,9 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); /* Class B setup phase done for previous decoded setup */ (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) @@ -996,10 +1037,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Clear Status Phase Received interrupt */ if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) { - if (hpcd->Init.dma_enable == 1U) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); } @@ -1037,16 +1074,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if (hpcd->Init.dma_enable == 1U) { hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - } -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if (hpcd->Init.dma_enable == 1U) - { /* this is ZLP, so prepare EP0 for next setup */ if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) { @@ -1054,6 +1082,12 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) { @@ -1159,8 +1193,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USBx_INEP(i)->DIEPINT = 0xFB7FU; USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_INEP(i)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; USBx_OUTEP(i)->DOEPINT = 0xFB7FU; USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; } USBx_DEVICE->DAINTMSK |= 0x10001U; @@ -1217,38 +1253,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); } - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - temp = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; - - if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - /* Handle SOF Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) { @@ -1264,6 +1268,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO IN Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) { + /* Keep application checking the corresponding Iso IN endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1276,6 +1284,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO OUT Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) { + /* Keep application checking the corresponding Iso OUT endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1955,16 +1967,6 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint { CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ { @@ -1987,17 +1989,16 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket; -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) { /* this is ZLP, so prepare EP0 for next setup */ (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } } else @@ -2030,6 +2031,12 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint } else { + if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) + { + /* this is ZLP, so prepare EP0 for next setup */ + (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); + } + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); #else @@ -2055,22 +2062,10 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U); uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - if (hpcd->Init.dma_enable == 1U) + if ((gSNPSiD > USB_OTG_CORE_ID_300A) && + ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) { - /* StupPktRcvd = 1 pending setup packet int */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else - { - if ((gSNPSiD == USB_OTG_CORE_ID_310A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } /* Inform the upper layer that a setup packet is available */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c index 987e5bef..0f04752c 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c @@ -220,9 +220,6 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru if (currentpin) { - /* Pin Mode configuration */ - LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) { /* Check Speed mode parameters */ @@ -230,6 +227,12 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru /* Speed mode configuration */ LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); } /* Pull-up Pull down resistor configuration*/ @@ -250,19 +253,11 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); } } + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); } pinpos++; } - - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) - { - /* Check Output mode parameters */ - assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); - - /* Output mode configuration*/ - LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); - - } return (SUCCESS); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c index 0197818f..588d0bb5 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c @@ -163,7 +163,7 @@ uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void); */ ErrorStatus LL_RCC_DeInit(void) { - uint32_t vl_mask = 0xFFFFFFFFU; + __IO uint32_t vl_mask; /* Set HSION bit */ LL_RCC_HSI_Enable(); @@ -175,10 +175,13 @@ ErrorStatus LL_RCC_DeInit(void) /* Reset CFGR register */ LL_RCC_WriteReg(CFGR, 0x00000000U); + /* Read CR register */ + vl_mask = LL_RCC_ReadReg(CR); + /* Reset HSEON, HSEBYP, PLLON, CSSON, PLLI2SON and PLLSAION bits */ CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_PLLSAION | RCC_CR_PLLI2SON)); - /* Write new mask in CR register */ + /* Write new value in CR register */ LL_RCC_WriteReg(CR, vl_mask); /* Set HSITRIM bits to the reset value*/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c index 2f82ef49..b3db0e6a 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c @@ -22,11 +22,11 @@ #include "stm32f7xx_ll_usart.h" #include "stm32f7xx_ll_rcc.h" #include "stm32f7xx_ll_bus.h" -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else #define assert_param(expr) ((void)0U) -#endif +#endif /* USE_FULL_ASSERT */ /** @addtogroup STM32F7xx_LL_Driver * @{ @@ -41,14 +41,6 @@ /* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @addtogroup USART_LL_Private_Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ /** @addtogroup USART_LL_Private_Macros * @{ @@ -65,42 +57,42 @@ #define IS_LL_USART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ - || ((__VALUE__) == LL_USART_DIRECTION_RX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ - || ((__VALUE__) == LL_USART_PARITY_EVEN) \ - || ((__VALUE__) == LL_USART_PARITY_ODD)) + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ - || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ - || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ - || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ - || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ - || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_1) \ - || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_2)) + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c index ece23086..8d9dbb24 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c @@ -94,6 +94,11 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c /* Init The ULPI Interface */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + /* Select ULPI Interface */ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; +#endif /* defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) */ + /* Select vbus source */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); if (cfg.use_external_vbus == 1U) @@ -115,7 +120,7 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); /* Select UTMI Interace */ - USBx->GUSBCFG &= ~ USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; USBx->GCCFG |= USB_OTG_GCCFG_PHYHSEN; /* Enables control of a High Speed USB PHY */ @@ -158,10 +163,6 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c * @brief Set the USB turnaround time * @param USBx USB Instance * @param hclk: AHB clock frequency - * @param speed device speed - * This parameter can be one of these values: - * @arg PCD_SPEED_HIGH: High speed mode - * @arg PCD_SPEED_FULL: Full speed mode * @retval USB turnaround time In PHY Clocks number */ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, @@ -173,7 +174,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, used by application. In the low AHB frequency range it is used to stretch enough the USB response time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access latency to the Data FIFO */ - if (speed == PCD_SPEED_FULL) + if (speed == USBD_FS_SPEED) { if ((hclk >= 14200000U) && (hclk < 15000000U)) { @@ -226,7 +227,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, UsbTrd = 0x6U; } } - else if (speed == PCD_SPEED_HIGH) + else if (speed == USBD_HS_SPEED) { UsbTrd = USBD_HS_TRDT_VALUE; } @@ -318,6 +319,8 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf /* VBUS Sensing setup */ if (cfg.vbus_sensing_enable == 0U) { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + /* Deactivate VBUS Sensing B */ USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; @@ -339,33 +342,33 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf if (cfg.phy_itface == USB_OTG_ULPI_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else { - /* Set Full speed phy */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); } @@ -431,17 +434,6 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - if (cfg.dma_enable == 1U) - { - /*Set threshold parameters */ - USBx_DEVICE->DTHRCTL = USB_OTG_DTHRCTL_TXTHRLEN_6 | - USB_OTG_DTHRCTL_RXTHRLEN_6; - - USBx_DEVICE->DTHRCTL |= USB_OTG_DTHRCTL_RXTHREN | - USB_OTG_DTHRCTL_ISOTHREN | - USB_OTG_DTHRCTL_NONISOTHREN; - } - /* Disable all interrupts. */ USBx->GINTMSK = 0U; @@ -557,16 +549,16 @@ uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { - speed = PCD_SPEED_HIGH; + speed = USBD_HS_SPEED; } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { - speed = PCD_SPEED_FULL; + speed = USBD_FS_SPEED; } else { - speed = 0U; + speed = 0xFU; } return speed; @@ -663,6 +655,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | @@ -673,6 +671,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | @@ -698,11 +702,23 @@ HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, U /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); } @@ -761,9 +777,27 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + if (ep->type != EP_TYPE_ISOC) { /* Enable the Tx FIFO Empty Interrupt for this EP */ @@ -772,27 +806,20 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } else { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type == EP_TYPE_ISOC) - { - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } } else /* OUT endpoint */ { @@ -890,18 +917,21 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDe { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + /* Enable the Tx FIFO Empty Interrupt for this EP */ if (ep->xfer_len > 0U) { USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else /* OUT endpoint */ { @@ -959,7 +989,7 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin count32b = ((uint32_t)len + 3U) / 4U; for (i = 0U; i < count32b; i++) { - USBx_DFIFO((uint32_t)ch_ep_num) = *((__packed uint32_t *)pSrc); + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); pSrc++; } } @@ -968,15 +998,10 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin } /** - * @brief USB_ReadPacket : read a packet from the Tx FIFO associated - * with the EP/channel + * @brief USB_ReadPacket : read a packet from the RX FIFO * @param USBx Selected device * @param dest source pointer * @param len Number of bytes to read - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used * @retval pointer to destination buffer */ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) @@ -988,7 +1013,7 @@ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) for (i = 0U; i < count32b; i++) { - *(__packed uint32_t *)pDest = USBx_DFIFO(0U); + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); pDest++; } @@ -1260,13 +1285,9 @@ HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx) { uint32_t USBx_BASE = (uint32_t)USBx; - /* Set the MPS of the IN EP based on the enumeration speed */ + /* Set the MPS of the IN EP0 to 64 bytes */ USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - USBx_INEP(0U)->DIEPCTL |= 3U; - } USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; return HAL_OK; @@ -1433,7 +1454,7 @@ HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c if ((USBx->CID & (0x1U << 8)) != 0U) { - if (cfg.speed == USB_OTG_SPEED_FULL) + if (cfg.speed == USBH_FSLS_SPEED) { /* Force Device Enumeration to FS/LS mode only */ USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; @@ -1594,9 +1615,9 @@ HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state) * @param USBx Selected device * @retval speed : Host speed * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode + * @arg HCD_SPEED_HIGH: High speed mode + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode */ uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx) { @@ -1774,7 +1795,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe uint16_t num_packets; uint16_t max_hc_pkt_count = 256U; - if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USB_OTG_SPEED_HIGH)) + if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USBH_HS_SPEED)) { if ((dma == 0U) && (hc->do_ping == 1U)) { @@ -2002,7 +2023,6 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) uint32_t value; uint32_t i; - (void)USB_DisableGlobalInt(USBx); /* Flush FIFO */ @@ -2041,6 +2061,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) /* Clear any pending Host interrupts */ USBx_HOST->HAINT = 0xFFFFFFFFU; USBx->GINTSTS = 0xFFFFFFFFU; + (void)USB_EnableGlobalInt(USBx); return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h index 31ec3b02..988ba1ff 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_CORE_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -84,58 +84,55 @@ */ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); /* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_mps); +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr); -USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t ep_type, uint16_t ep_mps); -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); -uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -void USBD_LL_Delay (uint32_t Delay); +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); + +void USBD_LL_Delay(uint32_t Delay); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h index 9fa2873a..a4bfc44b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USB_REQUEST_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -73,16 +73,14 @@ * @{ */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h index b1e7968d..8219140f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_DEF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -61,9 +61,13 @@ #define USBD_SELF_POWERED 1U #endif /*USBD_SELF_POWERED */ -#ifndef USBD_SUPPORT_USER_STRING -#define USBD_SUPPORT_USER_STRING 0U -#endif /* USBD_SUPPORT_USER_STRING */ +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#ifndef USBD_CLASS_USER_STRING_DESC +#define USBD_CLASS_USER_STRING_DESC 0U +#endif /* USBD_CLASS_USER_STRING_DESC */ #define USB_LEN_DEV_QUALIFIER_DESC 0x0AU #define USB_LEN_DEV_DESC 0x12U @@ -158,37 +162,58 @@ typedef struct usb_setup_req { + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t wDescriptorLengthLow; + uint8_t wDescriptorLengthHigh; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USBD_ConfigDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} USBD_BosDescTypedef; - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}USBD_SetupReqTypedef; struct _USBD_HandleTypeDef; typedef struct _Device_cb { - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); + uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); #endif } USBD_ClassTypeDef; @@ -199,38 +224,44 @@ typedef enum USBD_SPEED_HIGH = 0U, USBD_SPEED_FULL = 1U, USBD_SPEED_LOW = 2U, -}USBD_SpeedTypeDef; +} USBD_SpeedTypeDef; /* Following USB Device status */ -typedef enum { - USBD_OK = 0U, +typedef enum +{ + USBD_OK = 0U, USBD_BUSY, + USBD_EMEM, USBD_FAIL, -}USBD_StatusTypeDef; +} USBD_StatusTypeDef; /* USB Device descriptors structure */ typedef struct { - uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1U) - uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); + uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_CLASS_USER_STRING_DESC == 1) + uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); +#endif +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) + uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); #endif } USBD_DescriptorsTypeDef; /* USB Device handle structure */ typedef struct { - uint32_t status; - uint32_t is_used; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; + uint32_t status; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; + uint16_t is_used; + uint16_t bInterval; } USBD_EndpointTypeDef; /* USB Device handle structure */ @@ -241,8 +272,8 @@ typedef struct _USBD_HandleTypeDef uint32_t dev_default_config; uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; @@ -251,6 +282,7 @@ typedef struct _USBD_HandleTypeDef uint8_t dev_connection_status; uint8_t dev_test_mode; uint32_t dev_remote_wakeup; + uint8_t ConfIdx; USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; @@ -258,6 +290,8 @@ typedef struct _USBD_HandleTypeDef void *pClassData; void *pUserData; void *pData; + void *pBosDesc; + void *pConfDesc; } USBD_HandleTypeDef; /** @@ -269,40 +303,57 @@ typedef struct _USBD_HandleTypeDef /** @defgroup USBD_DEF_Exported_Macros * @{ */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) +__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) +{ + uint16_t _SwapVal, _Byte1, _Byte2; + uint8_t *_pbuff = addr; -#define LOBYTE(x) ((uint8_t)(x & 0x00FFU)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00U) >> 8U)) + _Byte1 = *(uint8_t *)_pbuff; + _pbuff++; + _Byte2 = *(uint8_t *)_pbuff; + + _SwapVal = (_Byte2 << 8) | _Byte1; + + return _SwapVal; +} + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ #endif /* __GNUC__ */ /* In HS mode and when the DMA is used, all variables and data structures dealing with the DMA during the transaction process should be 4-bytes aligned */ -#if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN +#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4U))) +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif /* __ALIGN_BEGIN */ #else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ +#ifndef __ALIGN_END +#define __ALIGN_END +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#if defined (__CC_ARM) /* ARM Compiler */ +#define __ALIGN_BEGIN __align(4U) +#elif defined (__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ #endif /* __GNUC__ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h index 0552e00f..8f077c79 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_IOREQ_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -77,27 +77,22 @@ * @{ */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c index 1cc9b19f..e3db03fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -33,6 +33,7 @@ /** @defgroup USBD_CORE_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -50,13 +51,12 @@ /** @defgroup USBD_CORE_Private_Macros * @{ */ + /** * @} */ - - /** @defgroup USBD_CORE_Private_FunctionPrototypes * @{ */ @@ -73,6 +73,7 @@ * @} */ + /** @defgroup USBD_CORE_Private_Functions * @{ */ @@ -85,10 +86,13 @@ * @param id: Low level core index * @retval None */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, + USBD_DescriptorsTypeDef *pdesc, uint8_t id) { + USBD_StatusTypeDef ret; + /* Check whether the USB Host handle is valid */ - if(pdev == NULL) + if (pdev == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Device handle"); @@ -96,25 +100,31 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * return USBD_FAIL; } - /* Unlink previous class*/ - if(pdev->pClass != NULL) + /* Unlink previous class */ + if (pdev->pClass != NULL) { pdev->pClass = NULL; } + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + /* Assign USBD Descriptors */ - if(pdesc != NULL) + if (pdesc != NULL) { pdev->pDesc = pdesc; } /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; pdev->id = id; - /* Initialize low level driver */ - USBD_LL_Init(pdev); - return USBD_OK; + /* Initialize low level driver */ + ret = USBD_LL_Init(pdev); + + return ret; } /** @@ -125,19 +135,34 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * */ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + if (ret != USBD_OK) + { + return ret; + } /* Initialize low level driver */ - USBD_LL_DeInit(pdev); + ret = USBD_LL_DeInit(pdev); - return USBD_OK; + return ret; } /** @@ -147,24 +172,30 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) * @param pclass: Class handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) { - USBD_StatusTypeDef status = USBD_OK; - if(pclass != 0) - { - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - status = USBD_OK; - } - else + uint16_t len = 0U; + + if (pclass == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Class handle"); #endif - status = USBD_FAIL; + return USBD_FAIL; } - return status; + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + + /* Get Device Configuration Descriptor */ +#ifdef USE_USB_FS + pdev->pConfDesc = (void *)pdev->pClass->GetFSConfigDescriptor(&len); +#else /* USE_USB_HS */ + pdev->pConfDesc = (void *)pdev->pClass->GetHSConfigDescriptor(&len); +#endif /* USE_USB_FS */ + + + return USBD_OK; } /** @@ -173,13 +204,10 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) { - /* Start the low level driver */ - USBD_LL_Start(pdev); - - return USBD_OK; + return USBD_LL_Start(pdev); } /** @@ -188,15 +216,25 @@ USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } - return USBD_OK; + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + return ret; } /** @@ -205,7 +243,7 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -221,17 +259,14 @@ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - USBD_StatusTypeDef ret = USBD_FAIL; + USBD_StatusTypeDef ret = USBD_FAIL; - if(pdev->pClass != NULL) + if (pdev->pClass != NULL) { - /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0U) - { - ret = USBD_OK; - } + /* Set configuration and Start the Class */ + ret = (USBD_StatusTypeDef)pdev->pClass->Init(pdev, cfgidx); } return ret; @@ -244,10 +279,14 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx * @param cfgidx: configuration index * @retval status: USBD_StatusTypeDef */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - /* Clear configuration and De-initialize the Class process*/ - pdev->pClass->DeInit(pdev, cfgidx); + /* Clear configuration and De-initialize the Class process */ + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, cfgidx); + } + return USBD_OK; } @@ -260,6 +299,8 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { + USBD_StatusTypeDef ret; + USBD_ParseSetupRequest(&pdev->request, psetup); pdev->ep0_state = USBD_EP0_SETUP; @@ -268,24 +309,24 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) switch (pdev->request.bmRequest & 0x1FU) { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_DEVICE: + ret = USBD_StdDevReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_INTERFACE: + ret = USBD_StdItfReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_ENDPOINT: + ret = USBD_StdEPReq(pdev, &pdev->request); + break; - default: - USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; + default: + ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; } - return USBD_OK; + return ret; } /** @@ -298,48 +339,54 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) { - USBD_EndpointTypeDef *pep; + USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_out[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_OUT) + if (pdev->ep0_state == USBD_EP0_DATA_OUT) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { - pep->rem_length -= pep->maxpacket; + pep->rem_length -= pep->maxpacket; - USBD_CtlContinueRx (pdev, - pdata, - (uint16_t)MIN(pep->rem_length, pep->maxpacket)); + (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); } else { - if((pdev->pClass->EP0_RxReady != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_RxReady != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_RxReady(pdev); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else { +#if 0 if (pdev->ep0_state == USBD_EP0_STATUS_OUT) { /* * STATUS PHASE completed, update ep0_state to idle */ pdev->ep0_state = USBD_EP0_IDLE; - USBD_LL_StallEP(pdev, 0U); + (void)USBD_LL_StallEP(pdev, 0U); } +#endif } } - else if((pdev->pClass->DataOut != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataOut != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataOut(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataOut(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -357,69 +404,78 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, - uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_in[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_IN) + if (pdev->ep0_state == USBD_EP0_DATA_IN) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; - USBD_CtlContinueSendData (pdev, pdata, (uint16_t)pep->rem_length); + (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else - { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0U) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) + { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->maxpacket == pep->rem_length) && + (pep->total_length >= pep->maxpacket) && + (pep->total_length < pdev->ep0_data_len)) { - USBD_CtlContinueSendData(pdev, NULL, 0U); + (void)USBD_CtlContinueSendData(pdev, NULL, 0U); pdev->ep0_data_len = 0U; /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else { - if((pdev->pClass->EP0_TxSent != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_TxSent != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_TxSent(pdev); } - USBD_LL_StallEP(pdev, 0x80U); - USBD_CtlReceiveStatus(pdev); + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_CtlReceiveStatus(pdev); } } } else { +#if 0 if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || (pdev->ep0_state == USBD_EP0_IDLE)) { - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0x80U); } +#endif } if (pdev->dev_test_mode == 1U) { - USBD_RunTestMode(pdev); + (void)USBD_RunTestMode(pdev); pdev->dev_test_mode = 0U; } } - else if((pdev->pClass->DataIn != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataIn != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataIn(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataIn(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -437,29 +493,30 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, * @retval status */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { - /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClassData != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } + + /* Open EP0 OUT */ + (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_out[0x00U & 0xFU].is_used = 1U; pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_in[0x80U & 0xFU].is_used = 1U; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config= 0U; - pdev->dev_remote_wakeup = 0U; - - if (pdev->pClassData) - { - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); - } return USBD_OK; } @@ -470,9 +527,11 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, + USBD_SpeedTypeDef speed) { pdev->dev_speed = speed; + return USBD_OK; } @@ -483,10 +542,11 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef * @retval status */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) { - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + return USBD_OK; } @@ -497,9 +557,13 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) { - pdev->dev_state = pdev->dev_old_state; + if (pdev->dev_state == USBD_STATE_SUSPENDED) + { + pdev->dev_state = pdev->dev_old_state; + } + return USBD_OK; } @@ -510,15 +574,16 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) { - if(pdev->dev_state == USBD_STATE_CONFIGURED) + if (pdev->dev_state == USBD_STATE_CONFIGURED) { - if(pdev->pClass->SOF != NULL) + if (pdev->pClass->SOF != NULL) { pdev->pClass->SOF(pdev); } } + return USBD_OK; } @@ -528,7 +593,8 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -543,7 +609,8 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -558,7 +625,7 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -572,11 +639,15 @@ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } return USBD_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c index c3e7ecbe..c51f3497 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -35,6 +35,7 @@ /** @defgroup USBD_REQ_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -52,6 +53,7 @@ /** @defgroup USBD_REQ_Private_Macros * @{ */ + /** * @} */ @@ -60,6 +62,7 @@ /** @defgroup USBD_REQ_Private_Variables * @{ */ + /** * @} */ @@ -68,27 +71,13 @@ /** @defgroup USBD_REQ_Private_FunctionPrototypes * @{ */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t USBD_GetLen(uint8_t *buf); /** @@ -108,7 +97,7 @@ static uint8_t USBD_GetLen(uint8_t *buf); * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -116,41 +105,38 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType { case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup(pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req); + USBD_GetDescriptor(pdev, req); break; case USB_REQ_SET_ADDRESS: - USBD_SetAddress (pdev, req); + USBD_SetAddress(pdev, req); break; case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev, req); + ret = USBD_SetConfig(pdev, req); break; case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev, req); + USBD_GetConfig(pdev, req); break; case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev, req); + USBD_GetStatus(pdev, req); break; - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev, req); + USBD_SetFeature(pdev, req); break; case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev, req); + USBD_ClrFeature(pdev, req); break; default: @@ -174,7 +160,7 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -191,11 +177,11 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); if ((req->wLength == 0U) && (ret == USBD_OK)) { - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else @@ -215,7 +201,7 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType break; } - return USBD_OK; + return ret; } /** @@ -225,43 +211,31 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - uint8_t ep_addr; + USBD_EndpointTypeDef *pep; + uint8_t ep_addr; USBD_StatusTypeDef ret = USBD_OK; - USBD_EndpointTypeDef *pep; - ep_addr = LOBYTE(req->wIndex); + ep_addr = LOBYTE(req->wIndex); switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - /* Check if it is a class request */ - if ((req->bmRequest & 0x60U) == 0x20U) - { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); - - return ret; - } - switch (req->bRequest) { - - case USB_REQ_SET_FEATURE : - + case USB_REQ_SET_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -274,10 +248,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) { - USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, ep_addr); } } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); break; @@ -287,15 +261,15 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } break; - case USB_REQ_CLEAR_FEATURE : + case USB_REQ_CLEAR_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -308,9 +282,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr & 0x7FU) != 0x00U) { - USBD_LL_ClearStallEP(pdev, ep_addr); + (void)USBD_LL_ClearStallEP(pdev, ep_addr); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); + (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); } break; @@ -329,16 +304,16 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped USBD_CtlError(pdev, req); break; } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; - pep->status = 0x0000U; + pep->status = 0x0000U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); - break; + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); + break; case USBD_STATE_CONFIGURED: - if((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80U) == 0x80U) { if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) { @@ -355,14 +330,14 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) { pep->status = 0x0000U; } - else if(USBD_LL_IsStallEP(pdev, ep_addr)) + else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) { pep->status = 0x0001U; } @@ -371,7 +346,7 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped pep->status = 0x0000U; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); break; default: @@ -393,6 +368,8 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped return ret; } + + /** * @brief USBD_GetDescriptor * Handle Get Descriptor requests @@ -400,18 +377,25 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped * @param req: usb request * @retval status */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - uint16_t len; - uint8_t *pbuf; - + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t err = 0U; switch (req->wValue >> 8) { -#if (USBD_LPM_ENABLED == 1U) +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) case USB_DESC_TYPE_BOS: - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetBOSDescriptor != NULL) + { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; #endif case USB_DESC_TYPE_DEVICE: @@ -419,14 +403,14 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; case USB_DESC_TYPE_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } else { - pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } break; @@ -435,81 +419,159 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , switch ((uint8_t)(req->wValue)) { case USBD_IDX_LANGID_STR: - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_MFC_STR: - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_PRODUCT_STR: - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetProductStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_SERIAL_STR: - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetSerialStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_CONFIG_STR: - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_INTERFACE_STR: - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; default: -#if (USBD_SUPPORT_USER_STRING == 1U) - pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); - break; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) + { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } +#elif (USBD_CLASS_USER_STRING_DESC == 1U) + if (pdev->pDesc->GetUserStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } #else - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; #endif + break; } break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if(pdev->dev_speed == USBD_SPEED_HIGH) + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); - break; + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) + { return; } - - if((len != 0U) && (req->wLength != 0U)) + else { - - len = MIN(len, req->wLength); - - USBD_CtlSendData (pdev, pbuf, len); - } - - if(req->wLength == 0U) - { - USBD_CtlSendStatus(pdev); + if (req->wLength != 0U) + { + if (len != 0U) + { + len = MIN(len, req->wLength); + (void)USBD_CtlSendData(pdev, pbuf, len); + } + else + { + USBD_CtlError(pdev, req); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } } } @@ -520,8 +582,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { uint8_t dev_addr; @@ -531,13 +592,13 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { pdev->dev_address = dev_addr; - USBD_LL_SetUSBAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); + (void)USBD_LL_SetUSBAddress(pdev, dev_addr); + (void)USBD_CtlSendStatus(pdev); if (dev_addr != 0U) { @@ -562,8 +623,9 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { + USBD_StatusTypeDef ret = USBD_OK; static uint8_t cfgidx; cfgidx = (uint8_t)(req->wValue); @@ -571,63 +633,77 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { USBD_CtlError(pdev, req); + return USBD_FAIL; } - else + + switch (pdev->dev_state) { - switch (pdev->dev_state) + case USBD_STATE_ADDRESSED: + if (cfgidx != 0U) { - case USBD_STATE_ADDRESSED: - if (cfgidx) + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { - pdev->dev_config = cfgidx; + USBD_CtlError(pdev, req); + } + else + { + (void)USBD_CtlSendStatus(pdev); pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev, cfgidx); - USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - USBD_ClrClassConfig(pdev, cfgidx); - break; } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + (void)USBD_ClrClassConfig(pdev, cfgidx); + (void)USBD_CtlSendStatus(pdev); + } + else if (cfgidx != pdev->dev_config) + { + /* Clear old configuration */ + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) + { + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + pdev->dev_state = USBD_STATE_ADDRESSED; + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, cfgidx); + ret = USBD_FAIL; + break; } + + return ret; } /** @@ -641,7 +717,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { if (req->wLength != 1U) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { @@ -650,15 +726,15 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: pdev->dev_default_config = 0U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); break; case USBD_STATE_CONFIGURED: - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } } @@ -678,28 +754,28 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: - if(req->wLength != 0x2U) + if (req->wLength != 0x2U) { USBD_CtlError(pdev, req); break; } -#if ( USBD_SELF_POWERED == 1U) +#if (USBD_SELF_POWERED == 1U) pdev->dev_config_status = USB_CONFIG_SELF_POWERED; #else pdev->dev_config_status = 0U; #endif - if (pdev->dev_remote_wakeup) + if (pdev->dev_remote_wakeup != 0U) { pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); break; - default : - USBD_CtlError(pdev , req); + default: + USBD_CtlError(pdev, req); break; } } @@ -712,16 +788,13 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * @param req: usb request * @retval status */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { pdev->dev_remote_wakeup = 1U; - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } - } @@ -732,24 +805,23 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { switch (pdev->dev_state) { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - USBD_CtlSendStatus(pdev); - } - break; + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 0U; + (void)USBD_CtlSendStatus(pdev); + } + break; - default : - USBD_CtlError(pdev , req); - break; + default: + USBD_CtlError(pdev, req); + break; } } @@ -763,12 +835,23 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) { - req->bmRequest = *(uint8_t *) (pdata); - req->bRequest = *(uint8_t *) (pdata + 1); - req->wValue = SWAPBYTE (pdata + 2); - req->wIndex = SWAPBYTE (pdata + 4); - req->wLength = SWAPBYTE (pdata + 6); + uint8_t *pbuff = pdata; + req->bmRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->bRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->wValue = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wIndex = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wLength = SWAPBYTE(pbuff); } /** @@ -779,11 +862,12 @@ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) * @retval None */ -void USBD_CtlError( USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_LL_StallEP(pdev , 0x80U); - USBD_LL_StallEP(pdev , 0U); + UNUSED(req); + + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0U); } @@ -798,18 +882,29 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) { uint8_t idx = 0U; + uint8_t *pdesc; - if (desc != NULL) + if (desc == NULL) { - *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; - unicode[idx++] = *(uint8_t *)(void *)len; - unicode[idx++] = USB_DESC_TYPE_STRING; + return; + } - while (*desc != '\0') - { - unicode[idx++] = *desc++; - unicode[idx++] = 0U; - } + pdesc = desc; + *len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U; + + unicode[idx] = *(uint8_t *)len; + idx++; + unicode[idx] = USB_DESC_TYPE_STRING; + idx++; + + while (*pdesc != (uint8_t)'\0') + { + unicode[idx] = *pdesc; + pdesc++; + idx++; + + unicode[idx] = 0U; + idx++; } } @@ -821,15 +916,16 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) */ static uint8_t USBD_GetLen(uint8_t *buf) { - uint8_t len = 0U; + uint8_t len = 0U; + uint8_t *pbuff = buf; - while (*buf != '\0') - { - len++; - buf++; - } + while (*pbuff != (uint8_t)'\0') + { + len++; + pbuff++; + } - return len; + return len; } /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c index 5600c370..4d5c8efe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -84,16 +84,16 @@ * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_IN; pdev->ep_in[0].total_length = len; - pdev->ep_in[0].rem_length = len; + pdev->ep_in[0].rem_length = len; - /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -106,11 +106,11 @@ USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - /* Start the next transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the next transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -123,16 +123,16 @@ USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_OUT; pdev->ep_out[0].total_length = len; - pdev->ep_out[0].rem_length = len; + pdev->ep_out[0].rem_length = len; /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -145,10 +145,10 @@ USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -159,13 +159,13 @@ USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_IN; /* Start the transfer */ - USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); return USBD_OK; } @@ -176,13 +176,13 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_OUT; - /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + /* Start the transfer */ + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); return USBD_OK; } @@ -194,7 +194,7 @@ USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) * @param ep_addr: endpoint address * @retval Rx Data blength */ -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.c index 2c7b2f09..6738d157 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.c @@ -504,7 +504,7 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; @@ -524,7 +524,7 @@ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, u * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h index 457df6b8..13647fbd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_conf.h @@ -68,8 +68,6 @@ /*---------- -----------*/ #define USBD_MAX_STR_DESC_SIZ 512U /*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0U -/*---------- -----------*/ #define USBD_DEBUG_LEVEL 0U /*---------- -----------*/ #define USBD_LPM_ENABLED 0U @@ -81,6 +79,9 @@ #define DEVICE_FS 0 #define DEVICE_HS 1 +/* Inform USB core that a full speed device is used. */ +#define USE_USB_FS + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c index c26b821d..344676bb 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Boot/usbd_desc.c @@ -123,11 +123,6 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); - -#ifdef USBD_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - #if (USBD_LPM_ENABLED == 1) uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); #endif /* (USBD_LPM_ENABLED == 1) */ @@ -328,7 +323,9 @@ uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) /* Update the serial number string descriptor with the data from the unique * ID */ Get_SerialNum(); - + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ return (uint8_t *) USBD_StringSerial; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.axf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.axf index 323d4f2c53c87a3ff491261488fb58cc61f2378b..2edb50c5af0202a14d08f3038a374a7269a6ec39 100644 GIT binary patch literal 1650656 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%0D&Ty}Tl=ILiZ#Y3boC}e~ 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®3 zl{C;4d9o@cjWPGwC3>u6SH&VMfkBAXN)*$w?KfM;lEsBe7Ivg#Yb0&%#+V~g0&qmF zS}~5;ZxKh7EOcaSjl_{VVvgvdhAU=`i*d&J9&yJ=Lx)T{SaP%yr|yqA#o7grq>>qT z%$EqOh(brk!Y3{~VqMTHWnkK@nK9O#?-2)#RCAiEA(I@Bg^?P^QD>jAo;Z!!t^M%K z{c3y3Ffrnz2QfB{r=BqGt_Mki_j1f-v~0W5hBXUoc1$4kal}DN6tC5_{c66J&P}3* zP`)1X%XAX($sAh8+=PgCRvd=T3gTh2;v{5yPBsHAd)lExTuf=AWWK~42^I|57>!3K zapL>d31=-3+_1}nj4N(}amP_pM4tUPBA_W(7djAm;zK=vld$xS3^)*Z z&f}avi=Y!0^+d-p0SnhF@o6jh!J$ChVku z4MX(eV7-yh%~iOQ(>U&lU~%%uHTcw1MTuF>XYIl}v3qKq&*J!?HvLo2AEo%zLu|mn zJ;9wG=QB9EC%7|0oLY{rqet%qc4hz@9#Jc0E7*c~+p;M(^)xxWJSzg1*Ar@9dMUhT zM}Ts%Z8*hIfu0jUWtgn^#7zOI$D@+)$gSq#;-JEbS;1W~ffx=@Ik_@gZw?eIgT^ME zQ|?_E!tlnV64s~dY!D_b^9I4mqyXN~I%Moou83|-0D~i#pOog3Jd8(Y`tb7S!M+7U z2;WT!x(>I7`B=HVjb*Tq5PNfoZN?0A87*4Cb4cc^kbvcGVX1GmsM+1v+R2>+>mDoY zp)leK^!RY(y%yM;4dnA!zq7!ZnLxn)D6qbIcg(AYtuVu@2K4CFBNmw96@m2XQ40*b zve6Ty6Fy}Es*hRKS@8@J$tO`Cx4_vx(6fQ13$}=?jVG+?oHbDG<~78VR(0;0sK&f_ z%2I9NQ<*A7e|ur`X$$P0;Um4QVrfM>tIs65QXi8lm#ZszeKyezDn`C;%#Y_1uAuJZ za><1L^NDU=bqezzE&4wtTtWTH_an%Y#OH;CE2x4_38MV|rg1&7#`mff1~E=JdZh8a zW`RKfT_79Z>lTAh>MqRe^I5`x z?MEqCZ;uZXwx2sNGi4W29qMA#_}qaA&CxD|@2j!HC3BuUCPdf)5D>y~iXiaDj(Wok zJE$xts#A>&ue5b+%dq!ck=1aL<(0i770q8+X$?;?;IY&sPBN~(RLL>4jCp;TD@}QP zjYu)@8^Rc)Z)CBXY01*H0l;Mt>(>PUGm2xrC3Ck4fXfD(wXI9l#KJ5UnA;P1WAVrW zS1umhk;whg?yMQ&z@3TQ8|BWJHKUiK(z_Bl?I#(SrJfeQJCW1AE8l|p_at)KcjZOO z?@i>i@5=iq|6L-d{UkoK)YZy;iJbObx#a);L{9szT=M@wBBy;xO-H&KJG~U zYbvRBPdMU%#PUp~{G=ltS?G#I`I$sq87?OMoW87kHWAkcJ+YM7bBP!Qf_;^AFWIds z?DL6u(E{1Kg>40wj8a^GN~Gj=wZ*lU61jUB&c_fC(U%>ma|Pb3`lnYCseAF=tNeOX zq?i^@x&ymuiZ{Zq@X_d@a)oQAcAv;I1C)5pDzB#-s^e|nSg?jWx#4)6iUUJBMqVpr8Bk&lKO^h}1)$(QD(ZJe$uAUEy zDG6kwjzGe+S=^g&Y%14l!pH%tUJWxYpe#&Im=bSrmd*91HZbGubO&dFG2H2XJKez< zFV~%+x3#Qr3eEMVyneiqbMLcGy;mz_|M8li(dMM$d(W$w#*?o2W7g*k8>%|5tr1g8 zGmWs4uB{PM_cDw~)f=}BDZ{tgcmlBfhaI}jz+=!nQ@7);5)rawi+{K@zDpgT<1!*_ z(Zrcneaj{-Hq)TfWl3jRu4Yy<)s@&zrgENPf8!bENxSeXe#xhHOV6Kb&QOAxk_-u^ zMlvLr3!&u$jAhJ)cHvhn%cr)i=SVe6C`l}blEiW-p=EVfHI!hIB}0N)l?(|cO)?~y z6UmTZelbJB2}M<`p>N%oF3gZH2vQYNIt)Tw!XU&Y3_@JOAfU*8niN?NimXQ$89r^1 z$;_I~qAzia%$K-D=1bfn^CfPP`4YFte2H6RzJx`F9R9-Ou!>=vydA#F9!YMUZ(GV! zf@-a-lZ@3sxL`v+2D-xxotgr}+AKZ=G_Yu-*573gNShqX%5m8}0qTbb>V3uG1=!OF zTQT#9is}!cIkZOkod|n#a@S?Daz)h_iT%!!dyo z2`% zDn2%D6uxi>MAO4IfdwHe%A zlTQMS4ecI3w5O9{KQ-+omcP~;Xaz&&8=iqMKkjftA<)8 zRq$LxhXs(82HoOcQ);n!A60r;lRIgtOpm0K%^XN5@n>Sv(kNZGSvIEcw!k|*ZDI+M zxe=S>Pk;o;W|qSy>!}R;J)Ezw0-;4w*>yI2jK|#cTOQe)?1~f!dsL2At0T1rRx{W+QErKHLn{M?mq1ji^P7#4<`8al)RK*N zF}I0V;|fMeh*9WHD%N+wRw4bB8aHaaDS&Az57v#l0?J}#xTM#^B}7#uV%0$c&@(c| zWyBlqJgDr%2!@26%JUAn^L7#8pUQ=iN{RA{IW=^ z1AH@fB2(Y-Dpw_~RYqiETyCJ{aev>J50(2XqeBkOAS3q!A0%6K+3HdqY{L8feF%06 z+(y>qxm0*&TTmPZa3p2MAHGLF^)dQhq%t?aT0Dfx!p*9gM5-pYZ?DfE8SHO%Z_TH@ z$~Ea1y?h=OgR|5Gny?RGqfq4d=oq|Lv)3a!2*EKioir3<2mucDjdI6AHD>igaGDE1 zQ<<4WQES1)(*w}l6bL?@5rD9dt}Qr4g)NE%Q_XhgLKon>qqX49MFGfhM}y$b#R155 zN1^bpal!CpTS|OwV6Gd}vqm((k%;CuD7wao&_mc9HgE@q8&fj@gzW6C3|}a`&Ip|| zh4jt0i9qH#2FjIz8O@nV8SzYWdm<;558#>PjsyTdd^va6yfcv_3!Ypy)4VH@Bln(M zPC|Dlayrkqjlww2RCBiD-#aRN%@ zbkNB4dPCfrP2_a2w>d{5DCU`gKPGZL5?|M(3X2Fbr+vwI=ol^u)txV63AgJG}x)!m*1{V(q-2;(m7j0f;! zF2>>eI)tjjb{RnE(7Sw~`{t*UHi<`^F0yDZo=e8NI?6ftCTu@**qGHuN!9qu zaDSN(*Lk_N_i!^Dmf0WY_A5+vH|wicF4=BJEM@w4$%txCy1{aW`5z#~-uLUC)Ob2` zeR#S~NsXttCJSQ9K4vXrx=u-rr?b|Fr|Xo|c#6q{Ag1gV*D|K-l+<`SdwqDCMaoXY zwp{eX=!Z@XdXD*OXE!W6U!OgP849driTK^oT9TR)@f-PClA1nlost?){YFkt*Llye zmZZj0zmcycsfp=2B{iPN$QL^c;AiPWqPh z+jE$UjCI;`tR<-_5xXq{ zI`28wlGJ$WH}bV4H8IU1wLJ&zsGj4_pywEPTY3&Nzp+kxjowInqqvQ9~j zr+&{tPuF?Rv6iI9Q@@d~C8>$&Iwdup`aK6dUFSW=T9O)1{YJi)q$Z|Wq_*dv9o2I@ z8T1^OuzEWN9WpP*xzTmncdRX|DHOk*uPv)7m37N%eD%8z@pYZ|A8X5MeD&M<+OnFs zu3J{)tKWr)uj{-ISzA`)tKZ(&mes^Hlht-3VoCKQd+8;*l*!bvze~Qqnf=&Pn_G4! z^PiwJF72|v zOP|+GWI0`rB}aD2{`7Hn)8h&4I_CCb8|5~^O$ia*6P)O(`w!!IIK+Lzgd3W}0PhkG zlv#t^TLbAk7LdByDz47W1XqLp;wDF^0e8Afc4 z9+Po{wk9D@KSVR8=dpm_=LDSlh?ho2hp}3~DQom^I#F$clo6ZZ{)V(HHdC{4e4>X4 zJ?vOwgwmF{x-5qs+Y>!Lu`m&@Uc!2M#u zRA?MPrNVoDCmPT6+vB<3rHg;WEp>o}!?-7nhY-}-VU_qPq^Wzrq&eBpD7VWs-0$R) zA-Q9T<&AiIks?$_CXa-umad)FNLQ}g6s??QtmrI{ZGlUa@+^qlv2dob;N*i#h_JvT z9T(%JzsAVqL}HkRm^DUYz_`4KSw7b|q_aGhGecuL<3RG9abU96iQZgby@{{7X2sQO zpLG80T5F2T;-{EQEp?)iON^1KUhjk@?P}qZRH5XH39h>=N>gWp)Y_;qVa`ru*<5yg z6y3hUxGk%hWMx!-?N2SB(oXqpz@l_Jfu*ZGOLpBI(yzyENv=^K%X#k4EfwK zAHDTiQ5zbO>0=^~`NroKR@ZTc;#L{M z@?aRB-TrzOsy^DMwiV#!F1zHQ)V2pRf!Z|-Wj2-r<{KFpIp1pMWB%gxRy{0SoR#A! z@fRrBWIYen!&ha^<&y=Os9FiNpm1R8go&-^w<2-_qr-A?$H_0J>8lqn>%vbOd(ytI zX*I7$!8`Ug!&We?>^Ou9MxgwT0A1IbyqzS3$$(GeZfNDEZ}LLE6wH#{q{)C#hO|AH z!Idg~%AJuTyjb3tr|cc)sffZ|s;b*nNK&_Hl|D>}r=z&2K2oadv<0vm)+J%6OYB#x*PC?xd8rjWG^ZQLnql zA4i3^`Tma>XRT2hKOw-D?XxkqMT`39jh~Ka%lCg{e3dogBiizPF3Q(a>NYQl7{8wt zYSl3^svBK)6wM3+JqEN!22edi1E0?@(EAS=Ky3{TY?onR=09Wrl{Yl-g_r?6_Pz#n zm}pz3+h_2tL0162q$k)R#usU0J*jg?k8|!w{9BU2H#evX`FwM2e!rN(x5XOqZDIMo zl)=|MV~q&AXIREBXEBCFoS)_HB!*w{7)OWm&*(Bp8|#$*)lAA*kDo)C^!Up%DPvuJ z4rS8i@0dv$JGJLfCg=9$nUt}!dk$rCdS8)A89Tw}P$p;ioiZt-=lC2>=Oq81*`#Y& z=+1e5Wj5&=7Q1t*Ulk|KJlSXEKRDa3j?>1^_gS3o34iA}Va6#xi_tshz-YDRknUt|{Kn`Ux5cpP{GGizZP{zjs-_E3rjRtZkli|R3GAUyN zf*i_ZM6er%v9UV9oW}+QIi$|0VD}u>*uWrr+UD9Pqq zA{CPa@{-*yf8Ld#& z7wp%+ymZ-;E*!SB{>1l(x5{L)gp=U#!%jf?&TN)3F@g-9%GtC=rL+J;sI9yBN9KFg z0j7Id?i6#9kD5*pLMv;SL9Uk4Ueb51KifGeVdqJs){24b8!1)I#-y zCLbTY0Et7@(I&Uk;VT00aO{Oh8eUi_A+0jPX}5akOgvYM)P+ly@33NJv%c%9#?tM- zT3WIEi%Y-MiDzyvhHStmxdcg-Qn56@>{4Hf)c!EFa2ci_3s+z^t8iuO#EGqc+W>`M zX_PQuRjfPPBFq>aY-xRU11w>$&-capNlJ)cQ{v*{id8m`F+%z}nfo1P{fMM6zp;V7 zVX3X^$0J4d_YL|MRO?VStPu7PK$qU!VC#C-+S@{H@*tA8Hb8Z6){Iio5$)C?N}h~2 zBT2Y>2TgSwH8`nmQ$nDYP z;@*x}DT{O_-lhxXeYI4gA{I<=(TY1bljnxbImYAq6!$nuon7vikLy~ zOysOQBuY|{KOu5<4pLPVa2`VBoIIrQ^QS~&h%Ut#%~H2<^k)Li%YC=;^ydQ2%RWm> zGIeN&9wTRaz!oLgUvzNnn*%hi9@Zg4+8m_u^p_nnQq4wUTV`ea@D8-*yg>CD>qiio z7pGoh{YW5j^8kDNWILd`6BO!E9r70VJQrq~NFA-Pc}~nU?jF;@O)2sUi+za{z_9|& ztE|`(UO|uRkQut{e9bbx9#3Rmu4WleParZcPqU1pClZ;LrP;>MlR9J^o9*Xp_<2f4shn3&XB#(9?WiuQ<&-^NdoF=Lt)st~$2iA0dAgKPUeljrygWmobMwp_ zKhKu-oFKi<)$1Y8A=2SYBaNr$sw%2aXY6`XSlgfdN@1P8FO4<4=XDhOF*R%pG=;QX z&-p|;1)4^}0SW&FL^>5OjRdJ6FC;S0IJbFcw|`Mby?(q7He#oj_a#^o;p$@AH)vPyk3^sD>wC(q9RLH^Yc3ra46j!3F%+FP> z-sC_{!~$qH-af)y-O@3yS{X4x3WtJT@AF%Mn(RcOrc&K1P}@|40j98;j`B8vVx<8u zJG!E*rlsC4&~gsc_GxzrbRZ9Ee7#ek^YWm^*SiEdKM!hry<4ERSw|vZd&+wRx>XLV z9i!bV&;@x=!_7-frjyZeNj@&V>S7IpkoyKK}w-w!6z?#W@6(a zT-y9zv2bCeFP_;$@gF*>cxyv(o-dqJ7Tt%8Fwu6=Sb5ul^@65x#OjhAnLMJ9daD(k zqeNM%D0X6E6M58y8u9?zGgqLGxlq&c0x0%pBJ1NW)SUeS=q$zhgbOw2p8z^Xu|DZS zO;;U2=PK5xT&U@*187mPKJ7xy@F#%wDb{BQH93!#fN6KnDrBkzw6a?Q&$&>i1YD>t zf#+SQ@gs3bSak{f$%Q&4;Iirxc)^7_CE!AJ3B2e+of2@Nx&&Twp-u_7P+bBqyHKYD zT&OOAS31hr#xA=%MRQiA`ey+S*`cpdL*@L75@8-i@fcC3E)_-aS3y4*ONfVBTq<&-nd%M}KL^=~<)05M}#~j@q!(v!{@=`O;PK^34v;8ue|r z{Hxt&?x@R|N0NLS2i{7sSlOnt6@twPcDKofxHl6EFT{!6Ep}FOb|$)8*WbM+>)XJ( zmo4LsV(O%VH_}ZWt@kxY8uOa->*kpN4MY3Ge`Xu=Ocpi}!Z?=W4`JW4uz7;Hz5kePt*@Bs$As? zKUrZfb6V>3a)6c3AHfET#!=~XT3QeErQB;ZfiSEstv~W1CF~J4TuyS#x3U3sP#nec zlH<&eEvj0YS1L6U8k7}j4z>VUWUakbjRN!IzEqPN>EV-cHGtKzUHE7=cHL=7|B^3u zer$RtQzcVq$43y;8^x#&511o~nHj~Xo(`C!h?y0|s4fneqluXv#i+gwm}7{U6UC@b z4VYtz>5gYi&!qu%oS@=a!~JVU5~$+^70(=QNNdyylhrI4{E`DVn$G+g_)eURIWoXF zQ|5%+Oq>C6(qvAK0U~o`4#v)z0d(?Y&Wiyg(_;?EPL~06%4A$aF%0-{jWN}Dekw5x zLKT+Oq>IdtVL;ztwFa<=G+o7MZcpq z6I<~6c4AmD(imGY?hu}4pPFFOSoJN57)=?7$?l!5V&B+`Y6=Hl-6dWbx@<+b=*)US z@orZ!$D&cR7VnwNc_>(t>8K=Ic6JKn_X?(|Cb|q%zBzST6r8y*=>5*oW2h5IRL{o! zzR5BL1`U2X*v@2X4D|O4jG2wWYz`j~7_%6IsS7Hw{a#>r4RREwu7d#kgTVL-$QYX% zXan}3zy>m4Y8ni%hXlrfM~qEfC;|3Ifz8i=scTEX9u^o|b&O42paJ%Xz_!YOscA33 z9u*kgB^zZ^Q(k~QHW|}e0C93FsXm=%t_z6ACu2Sf2+nFb2s6nA#1oU{mO3!%=DmYb z2{qHQo}A2C4gh)i>cE(4Fi#1_Y}%`_YE~nq;!bwJk*8f%V>|b$Jjfc^)H>%d*Kf9{AWp7k%+5g2= z%`JPQYRmqwu4-=C8&zBOe{)rH%igHkvVYZ8%`JPQYRmq$$(YMRZQ+cTQ}kwn3r+WR zA!q;1TGH>J)OS4+d1Er?s)*v0l|yBxu)y{A$(W@AhI3U8#7tcQ@ur;^Vofm+xPD`GI2;)3oT zQ}B9?ehjjpr;l8ntvUR%`Py@en)m`%&wx4f&YT!{_nKnn!3OGpn=kX0t@y%r%N#8u z@Tb8*u(u_cKQ01)x(x)soWgN_z1A!)>Tgz8tiq$QeB|?RH+g8)SNX(j_vj!W9`^CT z9^qhJDbz51V}#`qEFL7kykz|-H#y3$@!&t&!5V%_h5r~M+{zlj8-FoPLMVux1BG5u zz&)reg$n`&oWZygO}4^?Rsj{if)%xFTT+e}1rifvpUY|?#uxhY6lNu#9ue2b%;&NC8 zRNgUol`n|fGdi$#wTHL11R<7wV*$u=ecqt5wFRSjO(=?6OZ1>~ZJ=W83U$#`f*vW3 zdqY`9X;?-0{kuTNMnuy~K<=|3tJ>MsBL#7PAc~u`YOwf#uVD=;jM)3Vh2VJ!RqTB6 zFlI+QfwtA_7r9me`au_M?NBaO9&*LeB2K9O=wV|;n_wTdSe(C2N82Mk`y+uU9xbbe zJUr@a*jy-#A|KW*v~||A?byl^aU|vi4JT%<>9p{jSx#uTR>?9_j6T;$8veb z7sM?Y9pIn!@Ya$b#L{yX!0UH0BqxsNz4W*ptpPKCa?#cbaV4Q+NL)$?P)ryu=;waW$hZASbigfMVfC& z{r8kkx*3N$Z>Dt8J#?t^R!T>Ps@_O7)Y%5)sPZqHRj821Qt zyeNWRg1Bb@%8a4%2ef;I8d(vv8ha-i^+njj%3SNI6V^Uysm`2tu0`e?W%%*klwOiS zgOn`pYk_VBRp*lZLYX!l)Xzi_hQAl+ShE@>M!z3`qH*CgpL5^T02{K(gE0|$)6?I0hL6*f!x;{cx#G>bpj;!Pcq z?y6T>*-uhJou{BCI;yA-hlE--Uj`>R`?R)0`2G!mJ<|1eN0LxJ19oy*pyCoP>jxTfliMKikwl8Ps#FvBAN)w387XHlpYn7 z6GK=|Pz?1+DV^+~7@d<-I@v)nI;R9Wy(%a&Ry#E%%L|HVA}FVYT0u~HRZvb3VL3rD z)Muo0vV&rD&P?fK2gT@|73j=VK~WdxXQzaDQ4v){<(yC}h{{YAm2*Q_PE-u_uTnbM zQ87B_rF62RVsy?AbY|(O$TZ#sDPdkzL={oFFw_d7GD}6}q7ar76+?Y-N+&xiM(2{0 zPIgp`&ZU9QY#kLjmtU3==0!zR5tYkBtspA1RaAZ*!g8WwsIN%rWJks5T$$3zj*8K_ zD$tpuqS7N5OjoCbc~KEnMCCW3RuGjrDk|56u$-tE>T6Rv*-R74d~xiQoVqB2)S<)#pp6BR>!b4n*WDn{p)lumY3jLvOV2e*!gs_p>p z_D~cLNuq~{+!5&5fM^sbut#kGiiX3Zy(`p+1;f+0JJg7U!qd3N*N}lrXP1oH?hQpb zkuU?E-vv5;B=m^wz5tXR2}65-sF4{7qwzqfkr@f2@q1rGMk}3NGF1CRD9VY18Ra|} z==hP)!?cG2Py@Gjm$_Gji-DK8J3v4B~OR4oKTqY%rk+G9|}Dndo}=Nhr-Z4 z7iwgN!e~4nYGj7OX#C07kg*6tAtSLDLRn5I%pm5)K*tY-9)-OWfU-kjXkQLBGDBfB zUI{faLt!-j>}$vX1fh`O*Iz3SNSNjDzekit30>4z0&wc zqhVFDo)P&XGJG7S^&V1sctu*yjdQ0vOuwsG%xMEYKN4B+^^uIOlA}k$_mCdRn2L0H zB*ra|WPCAygGV9@u0E0pRdV!5_#VMW2 znu$bMVBA7bRS1hk?DB`kw)h{?FL5?^#g{lmIgKyN!wZ~ZiL{g>0&9ANw~Q_M4WIsC zS$LnzT|nON_G4{LK;ArG;R5n@w;yZsft4=M^077_SmgpOA8Yf0)fCWIt6YVxaZ1fe zmRLH;YdJzES+7Rdu_ZpqxX<-25T0ZNHn>1|k`dVG0^vzUV3P}kCmDgw6p-t_bb%-D z$SqE)Im@_S+{zI;%X*=^jV< zKhcrCX(7G$kJ#Jw{Q5qYK=K|n-sXwzlrOxF88M$yU%|MWgOtipcB+GUo&`g50+__SgIxkmweT6J)`PloWc z;{G16JvyzhKV*A!T48_0_UN?2{+R92X@&iXwc~Rec@OKUlj0MbbEyWNam1e5;OvmD7)XZ7(`)Z<5ZkLxuC)(ld)2A6_91MqI3mk=(~6CR1r)HSRkv3bk|8{;xW7egk4`J>i`gEX zR@j%YJvyzhFJ*glT47&i?Xm}uPODrMEN3M?t=KtOK>>SObw6b#8N$jPU|pymAfz&00XIm14%-340Cu@CH^fGlfzU9i(BH76OX;VzEQ zN!DwF-E4_ZGVXJa3xp>bfxRveo@4~}xj=Z55!mkn;Ymi|00m@`!`{L{C)J!~ERKgb zLT6bo6%Ml{KFhezBQ6l0Wdx48KzNoBIOYQ3Sw`Tv3xsDGffE#vH4j$}C!JJtma$fz z;s~8(y>d9smiR2=KF_#7c$N`3>jL3fM&O(agl8Fn^DYpcWdtsm0BvqxBtg%x`F*C` zJlJi%WZmZE>IU~^E9VnycDVVju8>#GsoCRZ@Ad5cq4CjxAHMDSZTfANEB!Ni?79nA`X}z#^#HE)&(E>zvABNd{7b`P{uTEL-L5A! z|GhN)E3OHphyK(CkN;OZo%_QDi@(Zjug!HZ$((m>vNj@O;o`q@>GKuto{DmYAA$=@{#@BWzO1?|r zlT)f$C6!>GIZuw2m4H1tQFsQ|t60)+=<5N>#dL2Ls$s|^Rv+>glsM$T`W8d_<^)-*fAv@L ziNby?RFjZNr2gbDByk97Kry5jiIU{Qy#raOCLxnZgUDY<;tmzQjJ0=p{9_(pu{1lsm0KE>3}8gwP{YOhLu>NP3J_xWsmS?G%by% z5kPs%&GcG8EWw1F3pbH z+VZaf=bWNYo;$y{!9+dJq0B5EAzmO0E~Mn@=Ax5ok&;ZvOB^Dk?l)d7md-Nn{?w%_ z+0ycL%~`s1`V(2w8g~C*G`@ZDr_@_N{;u;M%p&!G1%1>yx%y0c#1F~;D{{ywdQ=Qu zI(0~YuSwQJxtf0LlxkKA6k7HO?rE`f{Yyus$#wKI7OG*$B-V5C7nC@J^r9F# zckHC!L@2NEmn>A1kV&Lh0{II-OqaV zg=!KqiPY`i$E&+>Vk)vyvvw4R(Oxa<*LpKM7Nra%7f z+kY}|;=U|Yz)U8w`jJ1Q;1E*(V(8KdBzX@HV4<3XOd<^=e<6uONP~)@L+8$V^(^n- z!7NmhkV&K=dpwk~i>3r&O~_ zD#1o^qR_HOaHET*>tFQsE|21~d58u!CWFQfcMa9xJy`dE+Z{EdDsm7I5!Y$!M!DWx& zmKMvm-*x_j;$#h3=9Fq&NhREJP83}B2yR8OG+rut9V>6)l}@R~l~ls5;zYq^kKk4p zOXCSuoV=OWIHej_QVF+~69tz&f?HQCjVDxbc|&)-ld5?omUtUDQFz%Syp6@uct*jK zx56eTRr5+L@iud!@UlmETZ*Oel!7N$0b89^%`36Q+s28)%O2rvFP6r0N;Aj~Csp%G zEb(@7qVTduc)NP3ZA?l4mzotS7M2Gh!cgEJ;FO&ER82sdHI{Pk2tBCS7M2GloN%QJ;FOy zEZ_h91BP?C8ad92(sZMyaqZh!V-QNP6XY)}aR};EF?9V2B)P~xO@e~-+bsdoNaCEa z?t*FPLOE+?EIoob$BJ^yFxxnwbUzYGp!4LnB>h#43)Y}-?e_B0zsO36l2AfjBELoH z?;~8c2D~cdReyz*5GA36x=MbF(k+GS#n9>JKj({|_VRkaL4tzZ)1;BaxoO=6)6i2g zeFnkGc$x%ro0aMVO80}O=??iVNuQ>>)}T*Q{!Z6>tb`~$P4~%fQTjAJum*jazLCY{ zAuAyYPtzmvTa-RcPsPx=8UiS1pLYg<-sGkZvR1}R6BQU+?Y-_ z-Vu%8;O*|EszbE7l2Wc_I4S=6qhjjG);|@txS0; z`+6y0mRw@?bD1VHyM#GVOh0yzg#>@vL7vJ%PH81lDgg&`LU>J&;D!`S>VO~f%9Z{> zz425I^-?vknM;{rE>n=|66WxxsbfLPa5us!0THPL9Lb3$PdtJf)wKNlr^1us8SSM2 zSaOLt#$}qw>=NeKrm1mS?W=X1mjY(VCFXdSX)?1*m=l_&bny1YI?*Ws5vc^6#EB+P zJc66tv@{M}d2*dJ#Y+LOdY_BbOMnoD$%WO1RmaXyU{pxH-l0-OuSf>$Z`+_vbpPnpa|pH;)sAmp#Ip zUo4$Elt0&%|Jc(4Csp%GEb$g{qVTduc#Ddqv1^LslR91Oq-tJ?CEgNF6khfSZ)veK z_D;c*SLiY)Rr5+L@s@L<@UlmED~hE{r++Fuxtw3=q-tJ?CEhAd6khfSZ>?B5q?seV zW;^DWi@aLavCs;$nZ#O8enAz7kTx_8zyFhxWR2L!LO{|?B5fjnlhkksX>&287pjtE zY1qO-H3^wS+DiUH5{Hns7eji9=94E^6Fca3<(MI*ab`4;FgvZgP#U^Gc3GMJHNJ5L z#do!vy!PMWTfKY8Yd_!7>fKkoU2&lKV+i|6&?D`rA8o^(1>?mYf;7%W67;N?H%&%jG`(cq=B(&odfCdsS;1XhA#e3rf%htTtIrC&*NV5x zKVlC<>ft&GdZcEYY82uPYq{x{@rk{S*ny=@vg{N+dep7PQiIwKl~aUd0>0-|lPDfRerQ^{ zbOkbh4ELjxl=+($B7%wdi8D>2c!c;hTYl)8UMN3w(zRV){oVewP99?f~`4Rizd2#CFH5?#6 ziSqcnYBo{(x|qc_T*4iorcRBsntlmOH@4)w4s6j1xVbWR{ehy1JIKcr-1G@~u(RoU zET?!#i&jgPXd(~wF-O+*d6=`w>VV%j7~Ue*qOr1!@G*zhMR26E;q&XV2#snHYtfQT zM?Kod99n-lcAVONtIxFjW}|+^%=i|ql1$M=p5S9jZu-*Qq+iK!Hu(Yp{hgypEm|!Z z-#swd#~fL|jbVzj$?w?XnV#Ar)}rzI`O|#Nq4gUJraPN{4Pd@_p3x%Kq9vQo_e>vi zX#LjmIobAO+K_cC>RhKN)mE2HCFDF#WMJ{6e4DoOn-*SC7qAe(nk(u;@;6asMP1Z1 z@QS*ag@DvtQJ0XvNh&Mq(xw6HqW-OtWlm96%Zi##K9cD)F6UH}*j!OpG%Z*d)9=y9 zHP=cfDbuZ}iHKk#uHsCS*j!Q9X3GyON~_Nx}u(OHd;~7wurT8tf=RF%%OEfJ@0I^qF!hbYtdLyFZ!56>xz0M+kR}{ zvZ7vfic)QL*;IOpuW=#+iznsVw7uT6@QQkag#gxEQE!sJi7G4Vt)_uj)Y~isq~?lx zhx|=aSyAsc4Oka-MZM<~WworR>Et7sPUC$}HHpm?^+D5ug%K<2LnkTIt*D8JU?M)^ zOq1ALQJ-eZ4_#A|SJY=tQ6R6V%~ZlY=S0SpdrtZE;R|Eo74@Z46lY(Sa#zh2^%W-! zuB@o9t;MaVZ@h*B^ebvQMzf;6buo)AE9wU|b!wa+x1xS*(F&MWR2xkv_mht)xQUPx z{Mp&;iu$ERt0iMa{pw?mtSf4_|0wTi-~rK!+Py`rMPo(n;bRW1D{4a~bM$R3XkAf0jasfO(cJlRF=3&O#>DxUE(G?MOki%lgEu@Is3n7f9<4^iqQL;xk&ndvQ@HCcq^EqO84Ug~^7z@@ZY#1%{T0z>a?R=2PCh8&= zGgxs6cd441o21PXyR1bk;N}|Fxn&=AxsNHhi4gJ%XR~YE$`-Abj5ThRk2$igajTt; z*0?n-Vl5hL+*%)VXkFvhIUB8U>s!QHG}gEcKIYK6#%)$xbCb0BOmAt?D#;X0uduB? zrsSqC-A(#65ofb&-1Zi&mW(xShmSe3u5mk^jn=qbEn+PiYus)hb7)=T_Bb1@aeG_D zS~S+UeLm*Uy2c&Mw#IHLuW^T1P$sQ$%}jcJ50gK`aIYzx{=!bvz-!!576MXpjXOsE zCaJ7($D0PMRJz8UaEh{8*0^+JNTx$O$*Cr>xyGGpTCh}MjXUimWx6#k5fMzpGn{D> zn`_+pY$@B9%{S-;rznuuoW#@NFX1k7BIC+Er+oS?4`bmq?y^&WYvDE5xGNknyt2k! zH5RN>SmUmFtsvbRmktuybd=X!%wU^q+$}XVw=J6|_I8U_z_i9S&Mij3#J%HV3T`6g z4BvG&yT;vX(Q3(9*IBkLOXz}aYxd)Ok@qOrz3@-c_jHSV#q(Hi%pMXW_*jeF{2 z4y|k43$-=3Et}8u%NDJYOwsgAzw$99H+|`D(q}82&8~58TC`d+*0{Gm=E%Cny>m8N ztyAAHQAb&dPzY_!IGY7uMESmQqXm_zFt*Zn_k>{E37DgDmKkH7n|tA4TU z-^usNrazFGp12;xk(}+je3w6RlRrt}C4FSyn0{;Abu*amua^tS<1(&vAL+9XYD#s{ z@jLyflzgV49}5L&+pXhI%~%5Vr-ZLncv(f*PT?+$lLj6-vc-~{2cwMLRfJ4-&xG|DM44sA7>6NJ;I z8bcP{Z<0@AjCD$klT>={#&Lph`rX;%$)e>XpOv5Blo*Fzn#c*lX(vr0i#C#cRDQBk zVjQ|?3MUAsJv5ap+CuV4`Dspxap<4voFJTb&kVB2AGFg?mCSTXjKiP7o5cyj=^q80 zO&0k>Z@>C0`Mr@jPKj~&^Kf%HK{)+mdGpAU|KwS^N|P3w@3oj%{#M!ommy|yrMpPK z@4+UNi?qukuhl@&FN6oQntAV0rmbnZ=wP%*INsA_b;o%Ce)j-iT zD_w@6+BR#lsY_$^=wd&@xRwRwHD;&g)o(`=OKr1`A{hrq%BPQHkijlX8=O*cczRD* zmNs&NX!_FGL>9bq8dm_Dof6~lvf083!s&}5Kfn+ePprA(tfAJI4nyCI6*jFmJX7|E=z}; z663He9p(h#bXht=7P~ARbxMrGvUH3Sgwti|I9cqnbiyey4$IO>P7qF)rBh_F%hGA5 z#5gQVXE;GPU6#(0g_ossUWpu6wNpimtigG7QzWxt&cNziq5b9qk|DxZ@Nhx`oLGQ{Ug^ zP(~I{x{Ee#@3F-$PWQc3ag?|-EKd(yhLO5JJ!BJJM2!{dk(X+icnv*v8D{Eh=n0$b zGWFC;HB7vOp1BM&^(FM2O?It%;iVcTUO_KihMD>bdc`KYV7>NI4HHY&8<%0GE?RHd zWLK?sUaDbY-Fojb%+!_Z1Dov9_0dZ;Oe|iXT!xvte0^q`K1PdT!7(jaG}g>7()SVu-L4e=>Q)@B;&Y_z%!YZ2?n zXs6*m<;dDkqq0pFxNpDjYJS6bv{Mx7RyZ3>>%|xjWoGfDyGY-R$`-rAjq_5)f#S}v z!i{$sM(PSTflYWxHCDKZUaDc@^)$(4n5nO($!xMK+!Qa>F!4&7>N3pK*U>aK*%fZO zmui@J4b5;FX6h?wCY$UEH_J;kOssITU51&u!p&imUE$_>sfLLaZl239Q&+h8Y_cod z0x#7tvBE8M8D{DVw}?%4ge{Vh;?K%(gvS$WbLGl z&PFTTrWUb|j9%L8Q;w|7w8hzIh1=R9){)Up+kDEAwV!ro+pp7isCE3#t~R?^s6d)b zS}AsuKf~Zi;q+~+)_^CqvBvCWAtd41+(&*((&ur%HQ1Hq01F`r&)z}uTarF+hpfS_ zCx=-GNqDx7kl&K@c{*whb`?3sLP)|2a-95@q^rjXYp`p_Nfts9){Rr-w^gCtg^+|b;sW_CN!N#q)?inMODu#WtPGdQZ%Mi;T(Jhb zCR}A9Bw;C&fJU%12HRPn+cvS+rW($v;_tc2dkkyL{mU@w8vQT1$Jq z2x*_cqvb!94W)b`k))89W9e$5J0~nJ=hH`v$fEs{e`UU>lVTqFr57iNr~T5KEVv+% zf2Z!_q?m_(>B|Y?X}|O%i}p+Y()a#Oih1al0h}P7_RB!BXusrdtQh2^n1_BD%n9OY zzYHOZ_Dg%|m!VFIdFYp6oFJa|%W$%2zqFUn!;ElJ%tOD7 z?Z&m%pw%eNxQ>O8gkD@veoN9;++Yn_igL}hk%f?iM%+YxOVU2vYzm{PZNhEVphYOxS=(6%Noc_xGu$pGg|ITi?dF8VVTRj77F30F#a<`H zJha6=P7qJ~Vn125F!CR{Kj5U8ht4?23F2Yrhb&qf`D1{GofPxX97i}oJna9FMav`4 zaL1e!^Uxp1IYB(^0+B^4B+qasofPxXBBwY(JnRLLMT;cQaA%wp^Ux({IYB(^2$4nW zB+qc?ofPxXC>J|X40q2-F%SK6pA*Ex z9uZlzU-At1&`B{5{ql$t#KRsDS+rmB4EMxIF%SLnloQ0m9uZlzU-At1+(|JH{qlkn z#KRsDS+rmB4EM@OF%SLnniIss9uZlzU-At1)=4oB{ql|z#KRsDS+rmB4EMoFF%SLn zkrTwj9uZlzU-At1*-0@E{qltq#KRtuweSqr?LU(}qCBYN87zH2=|9`wmMU8MeZs~b z5hpAUGh7d{XusqcuBVg2zS+ha z^uXl0Y#<9E2}d=E{FbE0G}szYnT;842n!(zeL0l;mZWVt%o?;TWriEhLP$bWjv&7! zX-|%{2Cd2bExas*By{9x@>`NNXlF*1#$Ztv7hf}RV>riI6X)J^!bm4UJTaq^63~SILlo@U& z3n2+DIE(z2q#Zch8hD1Aj#$ooA`ig{>@1)LzB_QgW7Xkp|T zZjqB>9y((&Cy0lgAF^m|~29=c>bCy0j~A+l(la)Nl+BO;6TOP=8lJ1OR&Uyg8s zc-SK%i}p*N;f^^e=AmDXbAou-BO;6TOP=9QIw|I%Urup?c-SK%i}p*N;m$ZI=AmEC za)Nl+BO;6TOP=A*J1OR&UoLQhc-SK%i}p*N;VwBT=AmCMbAou-BO;6TOP=AbIw|I% zU#@Y2c-SMd7M|g5I4R`iSehYja>DX3!`&i__Di1OZaXRFpIiG`@}*>LN9(Mza?oaez68EMVaBgvJjHch~55k*|*6r?B7_D_F;Ex z&^nYEt_KSt30>He{FbCm*vlHU2xW%r%|b{*3-%$uC20rtwFaKy`Z+0tl^L!-CoB## z+yJtmD)N4hlVTp)Vh|^Yr+qP)ELs?Oh8yCfn1{|7$_e6O=Z7p>8+nEs?xdK9<`}^V z;$i=XELt9Uh8yLin1}ut%?aXR7l!g^678%D0;$bg{ELtRahMVA|n1?Qz z$O+7_K3)${gP+6rA~@@=$B=jARhLJ$fEs{XSfwkih1alm7E|R_K3)${gP+6 z)lQ0e=$AE|ARhLJ$fEs{XSj7vih1al^_(Cc_K3)${gP+6jZTVr=$B2LARhLJ$fEs{ zXSgj+ih1alt(+hp_K3)${gP+6?M{k$=$9RwARhLJtc7Q|T}}#lWro|$3CqI_w}&j+ zFL{RB>!g^6e%Z$f;%UDe%$C1tnc)txPysWUG#?!%e@4NP!s*MGtw9e=uFHXmlo{?E z3n2*|d7k{1qz!q&8nhr~hP%i@NJ2YaBEKbRH(s^|twx#QuCNf2(2G~eZ%NvU*Q`NH zQD(U7EQBO9;tld!lJ?><*Ddt0m8Hy`2>E&@O#AK|JgcSqsl_{hSo?$_&?^6PAY= zZU9-dU-Aq$&`B{5{W6FX#M6EmOcq>_$P72cNih%oGL#d_!yXY?v|sWJH`Ylp5B)NZ6U4(F5m~ff@(ee@Nih%o zGLaL+!yXY?v|sWJH`z%s5B)NQ6U4(F5m~ff@(ef4Nih%oGMy8|!yXY?v|sWJH`7Tm z5B)NW6U4(Fk+tv)H^)gKugq|BIbnI2;pUM=`z6nC^PLp)&@T%(K|Jl3#o6+&TV}W= zEL6ZuCe24n$)8bhq;Q+I%d9~UOs>n8vk;PSR4d4DNqS5xtpSzUnBi8j5R%ZBtI2Ok z+LmjqLCaERxV0>VBsAqZ@>`PjlvY;yR zevgx49@^pd*#0lbIFNiE!BzcCr;-r{|F1gAH;$cUK zELtadhP&>hn1@EW!3pAFUx+MPDtU&x<)oO0Ub)Q);$e4)ELtsjhP&&en1^<`#|h$L zkH}hhhI`wq_PR%epLCCi zEZQ%5hU?*^n1_Dp$q70>>=BVg`z6nCy`2>E&@X*BK|JgcSqsl_{hSo?$_&?^6PAY= zZU9-dU-Aq$&`B{5{W6FX#M6Emnk|3ZGQ$mHp#o+yX+9cG{)~bnh1;|pVGVj8u=|ryK%ZTXf?_VH-m+cgkGFUeoN9; zoMjDKiZa8^W+5b@5$BNKlJt6Ot~F>K$_zJ;g^+|UoKJpB(k5JB4O)aU!!2YXB%uWt zk>8TE0~cEZ&u~ke6vE03x0DkWhZ$}eSx^;uzsE^24{fo66U5WLSVx5v%tLdm;{@@r|3elnk37R|a8k@ee{AFg@vsX-7Ojvx!);so)qFGLnCl{~}k zaZ=1fuk7Un@vu8Y7Oj>%!|iuc%tN~z-~{ooM`SHL!yR%`$SX74VNO^cX1F6{(SFG@ z+)*dRJoL*kP7qJ~#XR)O8BP!ndqiZ> ze#tZ3IVZ(D^viip5D$AqWYK=fGu%Zd#XR)OB~B0zdqiZ>e#tZ36(_|!^vhLF5D$Aq zWYK=fGu(A2#XR)O4NedbdqiZ>e#tZ3Ehoi1^vi8d5D$AqWYK=fGu&M##XR)OJx&l0 zdqmd4Gu#6wg}gGuJ>-PtVTOA|7VVcj!##FV%tOCC;RNxtU!G^nZ(3%!7c5l3OeW1o zFUg-#aHMehEAQ5z2PW5LuUQC5II1_~w;`M>&`+*LOb># zza?om_Ou4AMw#Jyu@I8bi@nKjN!p5itU*grX1KmAgd{X#Kk{3W_F;c(&^nYEZU74* z30*jl{FbCmILI2b2xW#F%tA;)3l1T_C20o^wFaKyhB+yOl^Je0CoB##+z7IuD)N4h zlVTp)ViYHcr+qP+ELs?Oh8yFgn1{|7%L(FP=Z7p>8+nEs@1&TA=9s_<;$i=XELt9U zhMVN1n1}wD%n9OQ7lZF*57MaEg;$bg{ELtRahMVD}n1?Qz$qC|NM~Ez1 zCwYdO?WCB8Mw!D2;$dHiELtjghMVW4n1^1O&k5pTcZe)nEqR7p=%kp3c3H#;;$e@- zT6l(A;-rvQX1JxCusqCg%gCbrl4rQ(PKtTxmld2Kp7zU1vfzS5X1G;Oih1al)tn$6 z_K3)${gP+6wN8q8=$CbzARhLJ$fEs{XSfYcih1aljhrAJ_K3)${gP+6%}$DW=$9>= zARhLJ$fEs{XSi)nih1al?VKPU_K3)${gP+6olc5*=$BobARhLJ$fEs{XSh91ih1al zy__H(_K3)${gP+6{Z5K`=$8YWARhLJtc7Q|Lrw~LWrjP<3CqI_cZ4k3FL{PL>ZF*5 zemTYo;%UE}%$C1vnc+^cPysWUG#{NNe@4NP!fo1~u?9Ubxh^})LP)|`=`o$R z22^HahP%K*NJ3v;B)=tTTVApTElZiIiGyTd|ALNDGWza?oa-m?ZRMVaC5vk;Qd zh!4nbN!o`GtwHNhX1GTzgd}v~WAa;)HsKR%&?1x>?kNi)2`%`H{FbC0_}m(JhI`?p z5LRZmmz=OT%y6&Bf~v^-Jx+>wXp1+TAfEQcTe4_j*f z?xT}p9-8A5Cy0mrAF^n9!K^E6SRQ7$Wn|HQ$urz?C&fJU%L+~qPy1zcw)}m|47Y}b3Yf{H`DiWqGYXCr zZqs(1HRyrKb=i6rLK2Q@1NkjUk7=VdpfVdX+$I)668ds8`7KG?a*H)+S;`Ezm4%Rm zrrbt;OVXa)ZVg(KGQ;g)Ata$Acaq|s{gBGOBaJyLuNodDCUAdK|JjLkVVTQ&v4hA6!Xv@*EvBv z>;jQRDm<)`_nj2;&?pZ$ zK|JgWkwr@-&v1{N6!Xw4k2yg+><*Ddt0m8HPn{I=&@Rt7K|JgcSqsl_FPs$e$_)3C z6PAY=?iE?IU-At1+DS1F{qlwr#M6FxOBP&^$PD++Nih%o@}3jK!yXY?v|sWJ_t8l) z5B>6q6U4(F5m~ff@(lOINih%o@|6?B!yeIpBYQ;o>axA|OP=AnJ1OR&UwUwYc-SK% zi}p*N;d(hK=AmDDbAou-BO;6TOP=BSIw|I%U;1%^c-SK%i}p*N;RZM<=AmB(a)Nl+ zBO;6TOP=8dJ1OR&Uxsjkc-SMd7M|gTIVt3o8E!ZyEDtl>2(oCuw31rd3ldH3dPKj|ix=EZMoF3g|vYhthwhxg3BqZ2&LoR=rwn$poD$29u5VjP-t9w!K=%{iYe+MF`tEpSSVLvb$T1mUze7m-DaQ|7$IPKj~o%_W>5 zoc88YvS@G0u(!-9F%Gr4oD+o8+FU^vtxcKuRyrldp*2@=f^gcJtI5J+-x{yQ#4`A; zbs1t}^jpU!luO&fP{j$Mj7^)4kkxg1Lc>vtxwHhc|X0yvM6kA7Z(xS;z;8w5I zK+!eZT!x|8MPifIO&$ezc&!GC#@XpI48?{Lo3wQDJh&cnqvC0oAt;8$Gi=gE%G2Umuhl@&NatLJq1s62 z*@TN885u8ltpQ8 zL$N`{CT*lVLEiLQ4HS)Z%VijfT`D$dBjqvjj@N3SXr#L?!%%Ehu}K>#&yx4ORs%&N zJ#ZO@V!w(_+DLhzeB`wnC>rUp%Pt zaQV_@2#WFY6`Qn?@_hN)Yc)_b(i@jys5a7jHRZpS{_9`TA4^YvNWC$IeQ-(@(WFx1 zBPWyxPs+Dx`-v=ih;kM9*(os&$M=O3gwvz@N*2^@XaCVHXX(Z!fBTdCyQ38 z%$Osb664ULBRN4hZP8I=(GryzbF@=p92#^CCkUtgIhHIuV~+D$Oe{0zc$Xn2X3Pm} zLb>D}EU(o-(Jzx+hN0Rpli8#dlV{8+UaNuPif*dQFjRYH8k@9e@{Bp%Yc)`G%?y`e zD0Z~iq;->L%voNmfueC{y9`6Iuf--UojhaC^;!)Sy)(~c7>eC3Hfi~XP43nkqLDVc3`4b%wy;SXDbJW&y;cK7BW-gThGN%?P1;C##@ykx8YmiRr^_%DyIyS4 zM#?khZm-oq(MWq-hN0N?Vv{yfo-y}%tpr(K4i zm@&_=NgFB8m}k9K14Sd9a~XzeBVANe`<8#lyyTQBqDiH>?J_5n2T#hkX?uk%dWdor zc-1K}4##(m6NJ;FyG|C=ZDYo~;glGMuD!_#!fDgqB8wKS%$T>G664UacQ`>f?by3y z(TbHB^PW>;9QyS>CkUtQ`hYB2t}{*o1P)J6K+;fudi&xC}$JVZO3SD<;pF-Tu40 zkChv+os>k&MphAZC(C6Rsy)+#OTjS~q#d?Blf>C>p1) z%P>@p0+9v7Rmfbxtv)N3_R zbkH!DVJLRG*rYX-XUq{^tAV14M!F0`vERieEu%bRj`ms&6n!+tWf+QGFEa6rInHY_ zw9J^}U522TF(jO=c4=dSu3&;D~8YmiRw#zUSyIyS4M#?khT(8wY(Ma=LhN0N? zVv{yfo-r4AtpYh8w*m@(I}NgFB8nCrb(14Sck za2bYbBW+gGH!U;f7N=AZO)AZ8TREXTcv8Mi+ihggLzJt)?M{htIKCa6AeAbK#|gq|$L=SKR;b)(60wMK{##K zLuAo%l^OG}Q(_#N^#~^jr@eZVELy8FV;*x#j6L%zIv|fueEly9`6Iuf--UojhYc^jZxRz4ORr7>eC3Hfi~XP43n;|rL(7c$(PapV8S@jHw2|_R`PpkVP&CpPmtm+j z(pNU&qDN-TZk&)hY1#G47i{g(NZnn={h0rRTo1lg8!6A2J-t?Qq-dmGF5`a8(B6Ej zHd3B3`*^Jeibm?|GVaF=?Z>xjBjp*hzt?J@Xruuy<9^K0fqbhrQl2pfd94PDMjGrg z?#B!r!nbN8q+u@Oe$3F}e5*E6o-s#wtptj5*$A+>aSLfp67D$}{Ffuhl@&NRwQ~{g|Os^R2(` z-2Ru2-`S7KPGg~hXEJGMn@)cEA(Lj<+w|b%`fnx+AqmGdi~RIMCe60Dp<^3^`RRvDnrCm*VwIV4J_{iUow|Vh^g|{sw6|%S$~d`*g^+|IT}*!ZA(NKa+q6Pu zl3dC{NJ4uqBR~C+Nz3hR+M6;&u3#Y~p)yyJpMJ=sRrWS5OPL>6vk;QdlWWLNKV;Hc zdz&_-jE?JA2uUc%_2j1?GHHXoO>0r6#*Hk5BsAhC^3xBQwAtRq1LGDag|IR%Zsi33 zlzH3eMpQ-KiE>iRLtE_N1pkzIJLyI(j65dpa#GAgXYA$#|CD)q=tixLJR$CNQp`hh z?BfLglzIE*2%d3L%tNo7KV{xsx>5Tjk9zl<6!Xw8 z_c_5oW!?k2QTruNc@Lcw^UyDkIKe+<-ebB^`y~%}Pn;C<&@WFp!9Qi*GrCdxCC_%x zofPxXFE2R3KV{xax>5Tjk9Dt{6!Xw8uQ|a#W!@XQQTruNbZ?y$^UyEvIKe+<-g|o^ z4|5-!6!OX__mLC)Q|5i58?|5Z9QWBtF%SLng%kW!=5_z?^XH{nX1E?KRKVIbGig5R zN&bw2BZb?v?PU#mU~*m7n}v{sqv}I`OVXXPzSe-sY|L=|SO`hz%l_oIB;BwdU=3Q9 zGQ$mIAta$G2a(^BbeDdxHE2!B3^#;@kc5sLN`6byt@&Zrpam&2+;A2`654SD`7KHJ z<40P9R-?>tqgV(@=*7|GwNyftVY$_zJwg^+|U zoJf94((U$1)}TcwGu&hrLK0eV3i&Nb_t>Xe1J7{NoD{;!3^$z<7MDCJ-=^&hvY;yR zevgx49@=6SCy1wgF`Fz}7h2$A-sgq(JT4Wg~h^IZWoGe--d4^lzq?m^;S;-0F zX`8Gfi`Ge=;Z{2-=Alv6aDsT+DQn51rIKg3bxw+T=#}-HAf7hM2C`_i!g^6e%Z$f;^Fg3WYK=fGu#0u#XR)OK~4}4A6O!b z_Di1O4m&C4p~amk-HrN!pf=tU=3CX1K>Jgd{ZO6Y^V< z_T*D*(3+GP?imXq2_5;I{FbB*`NA5sAZ3Po$wEj%JH8^nC22Rlwg#<6nc?2B5R%Y~ zZ^>^-+KTV2K}%6)xc4lCBsAg&@>`Pj;YVxGI+Pji6AK{;UHF;&mZVMi#Tv8-Wrq98 zLP$ajcKaV>8z;Y6|K5_c1G`%T&u~4Q6vE03*OL<#hZ(LHSx^;uzsE^24{gzh6U5WL z=t~wYj6B2jb5hJhXY}U;@v!ql7Ojmu!wqy&%tLbw;so)q|3elnk37Q-aZ=1fe+=aW z@vsX-7Ojvx!wq**%tMQe-~{oo7ep2%!%cQl%tO0O;RNxpM`SHL!%cHi$SX74 zbWT_vX1Ez-(SFG@+)O9MJoL*fP7qJ~Wj0xGK_WBU94Ey*^vhgM5D$AqWYK=fGu(V9 z#XR)O0!|PQdqiZ>e#tZ3A}7T>^vhyS5D$AqWYK=fGu%=q#XR)OGENW=dqiZ>e#tZ3 z3Ma)p^vg<45D$AqWYK=fGu&z?#XR)O8cq-odqiZ>e#tZ3Iw!?E^vilq5D$AqWYK=f zGu%ce#XR)OCQc9!dqmd4Gu##@g}gGuZRLdJVTRjA7VVcj!)V6AEss3IJ#$jbLw`Ky1o5y7L>8@(Jj1U{^Lzlee z1o5yVL>8@+Jj18@$LsL%;Ol1o5@vuik7VVcj!wqy&%tOBn;so)qM?@CwmpsD_aZ=1fzYOIB z@vuik7VVcj!wq**%tOD7-~{ooM?@CwmpsFba#GAgzl`Pt@vuik7VVcj!;N)P%tOD7 z;{@@rM?@CwmpsEwa8k@ezf9x=@vuik7VVcj!%cQl%tOCS;RNxpM`SHL!%cHi$SX74 zbWT_vX1Ez-(SFG@+)O9MJoL*fP7qJ~Wp1|oP0I{7kA(`D$)x#cKKU~WjudXwc7ZkM zfys5*LKZ?2j%pG4ElH1Qu{EGF8#CMz7D5vGaw+*ON!xOnHE3DN47Z$xkc6gOL4Hfp zo?K}ST9Y!vtzsc0p(9t5-;%T;*I0uVq|9(@SqMpJ$93elB<;ra)}YlWGu#FiLK1p$ zBl#^!TXB;$Xer7Jx0!{Ight##eoN9m+-eP4hcd%$V<9A=3%8TslC%kTSc4X!%y2td z2uWzcUF5eU?ZDmEz%$$)Cxx&w!|mmS#bJiqM;25?-tTcz%tKoo-~{osFAkDL3nR~P zhny7i&>4q0K|JjIkVR`F&u~Yb6!Xv=$2dVe?EjEO%OlTlC!7@X&>tr`K|JgNkwq&c z&v2)m6!Xv`XE;GT>;;iUizLr*=bRMt&?V=9WD&v3V#6!OXpcbgNIhZ*h; zS+rmB40qQ_F%SK6j}yexez{K;T#(2N_rOUp5B>6x6U4(F5m~ff@(lObNih%o@`Mw_ z!yXY?v|sWJ_smH#5B>6-6U4(F5m~ff@(lOVNih%o@`@A0!yXY?v|sWJ_r^&v5B>6% z6U4(F5m~ff@(lOhNih%o@_`e?!yXY?v|sWJ_sK~y5B>6)6U4(F5m~ff@(lOYNih%o z((QkeJ)%5nwAVc%{G@wC*1|Jf4=07ZGQ;)cggrjYaJ|T){gP+6-cE{n=$Ag6AfEP1 z|7`i!Ei>Ez7AjySljfs=6hJ}!XjvPyVOVWlMXAN4A zGQ*8$Ata$4Cy?Kgv>PW{gI1%=aFbXFN$ADNBFrJi{GzQp`iY9ODG>ut!7|?Uy{mop4gjL%*El1o5y(L>BFr zJj0!KQp`iYoZ$rVut!7|?Uy{mopVymL%*Eo1o5y(L>BFrJi}ddQp`iYT;c@rut!7| z?Uy{mU2#&(L%&?*1o5y(L>BFrJi}dgQp`iY+~5T9ut#JqJj2~`QphVa+-*)+9%i^Z zWYK=fGu&M##XR)OJx&l$`{iM_{B6q&_lSiGn8~F1=rQ>-3XT+R)Aorq=z+;~*;5um z5{~K_`7KG0>A5waG8;483l>5W`tl|DElJz*l{IKt$_)3Kg^+}%d_#Uq(w=;44O){j z!@Xl6B%veUli!lGAwO7y7NpE@A6W=VXva_Fw zp#}Sq-;%Tg`&$Fga08qa!paOckP{Y%8Ez0+P!)N<$4M~{Z83xs#M8bQN)|1QJi`rh zQp`hV4Ce&#u=7I}t&KdxjdW7XLvxJc1o5!{Ll!NMJj0D~Qp`htjO7IJunR;Mt&lv! zjdxPaLyJt{1o5yJL>4WQJi|?LQp`h_Oy&gfup>kkt&=>%O?6VtL!(UN1o5yhL>4WT zJj2a!Qp`iI%;W^|uscK+t(H8)&301EL%Yo31o5y(WGy_y&2v)7D>K}DPFNmhxCLa< ze#tZ3LMO#M^vfbn5KsGMF4|_yp(SFG@+)gLOJoL*h zP7n`!MApJH+#V-|yfVY><%H#7hTBIL?Uy{m?RQelL%$s01o5n0vk;PSR42%9NqS5ttpSzUnBh*b5R%ZBr^#`PjnvY;yRevgx4 z9@^p=Cy1wg@tiDL7#`;$atvELtIXhWqHGn1>em#0lbIFNiE!BzcDW;-r{|F8Rs{;$cVVe~}%b zyt=j1I>|F!cPGU>G)fOn5D)u8WYJQ|Gh8nx#XR&%Z%z;oyF+BrYRNNPUnj*pv`aru z5D$Aq*1|K~04IgKGQ$nzgyms|8$=fEmpsD_c2dkkzYO67@w8utk_8teGQ$mXQp`iY z4Ce&#ut!7|?Uy{mjdW7XL%)pT1o5y(L>BFrJj0D~Qp`iYjO7IJut!7|?Uy{mjdxPa zL%&Sm1o5y(L>BFrJi|?LQp`iYOy&gfut!7|?Uy{mO?6VtL%&Sp1o5y(L>BFrJj2a! zQp`iY%;W^|ut!7|?Uy{m&301EL%+=71o5y(WGy_y&2v)7D>K}DPFNmhxCLa$LK6CNE%_};+j5;XXj#e(x1NQNgr?j;eoNAx+-MD2lQP3?Vj(1< zBR7-ZlC&YWSc4X%%y3&-2uWziZREEk?Z)lapw%cd+zu8(5_)kb`7KFXahEk{Das7D zn}v{sM%+VwOVU2vYYke5GQ;g-Ata#-_mkg}v6t z6U5Vgc}^BwkjM=8!bvd?{qm9%#KRsDS+rmB4ENeeF%SLnh7-iY9uZlzU-At1&Pg#3 z{qmj@#KRsDS+rmB4ENDVF%SLni4(-b9uZlzU-At1#Yr&_{qmI)#KRuZ|0;V#`Rcj7 z_Di1Ox;rW6p;y8Eza4Aqjmsp8S@iZ8^ajv@B(Y zo5(^)LQ_s6za?o;PPPWENtxlMun>~akyFWUN!pOptU(J>X1M7rge0`%4Dwr&cH>NI z&}x(!ZWaq63B5R*{FbDxIL8{a6lI2+%R)#(BhDkgC21edw+5|4nc)_&5R%Y^3(0Ru z+JuX&L5omkxWz1lB(&fX@>`O2;8JVg8E%=ALRgvMmUF`5FvG1N3#uaT_c$r$p)FQ% zf_T~&tI48;k!QFyPKtTxjJ2E~9(I1nqP3A{xb;qod1#IeoFE?df5@Wck!QF~PKtTx zkIkGQ9(IAqq7{;7xUEi#d1#SsoFE?dg2$_dNE40nty+An#AJMN^IhkiN13F2wLoFoe_NMwdP<)oO0emTtv;$e@7EZQ%5 zhCAz|n1_Bj#|h$LkBBVVFL{Q$;G~#`e!0jA;$e@7EZQ%5hP&*fn1_D3!U^JGkBBVV zFL{Q$=A@X1e!0#G;$e@7EZQ%5hP&ycn1_D3#R=kJkBBVVFL{Q$Zl$q|cQ(_#t^9v^kr``FLEZUti*me6W*~!s!FV&a+?B74P z`(vkH{hNP7cZKTg&I#v{=dK4?v^r(F>*P8J^fMtChImcehN%McTz-zYYrT=G7V*J_~XmoYBGP;Hp8Y|@I!1K>EX z)j-iQ<6VZK*g9g97EPW4Cwi?0imsXDG7QBo5}UMc@+dgPYc)_b&QzCSC^nSXq@|PR z!RcPBfueV2xC}$Fx5Or`o;(!J@>&fP?K9hD7>aEsHfaIn$#AaMYM|(#c`n0H>^QMW zYbcM03%phXMH4M_8HQr>iA`EYc}869wHhe;Xo<@(6#GzQ;z4nl*J5ZH6_>jVK`|_@ zV3Rgdo)%YntpN8YmiRkIOI=`&DexM#=-_KCjh4(MbDUhN0NBVv{yfo+=M| ztph$y*rbh==gZ?>tAV1CPPhz1wUJJ%sa?yA zdB!PKM3YK$+gVO151y27)Ak%$^bqAL@VrxE9FFe-CkUrUcabcp+s2G}$tf`oU3-}m zgwv+ILKZDrnK7?ACB~s;uW^EK+OgNkq7^GM<_)LBIP~jHP7qGp^%hyQTxG_*?UWdY zX1&7+!fCJGC5zUo%$WC_664UR_c=j0ZPW*3(L$9O^Py8>9NP2|CkUrq`j{+Qr7~ka zaY~Fsk3QuD;j~4ckwr^XX3XbKiE(Jq7n~rR_UB8o@QnG&Yca9Rn6F)in3yr&unFao zcd)!x14X~Qa~Xze!@OscR!p8TKX|PMikA84G7QCD7Mrwa@{IY}Yc)`G%@>zpD0Z~i zq;->L%x?cO?`h?(Z&$skRm9)_-~Uf);O;KNQ0<%^Y|_%nGiFb()f_2$rN28YmiRlFKj@yIyS4M#?kh6tC4l zaSb%pWf-cBG>uK#NO{Jb?zI{y8fk{hFciC9Y|=)`Gv+L>)j-imvt5Rv*!5zQHd3B3 z=X$LMibk5}G7QD87n`(^@{GB_Yc)_b(n6PED0aQrq>Yqk%*9@-fufO?xC}$F>qRD> zF_(EQhL#y~xyuj~Gv*35X(QzsbEVg6plGC3F2hi5q_t{l-!fyab4nG_q|#NxdQK=0 zo|JFXb^}@T5alXxqf=rWj&Bnu2&YH4nJlQ=#*DeeDKQRRyOk4!)27`<7A;ztF}FJ< z#-U|*aDs5!u{+746)Q95E~mse^y_X;5Kh~54_UNaWyaj=lo*F*-Ny;SX|L`li`J^l zm%#%)uacIy}oFJU`=V`L=jCsauF|o{;XI+Mvm@&_>3FVS^u)J0SMZa8d8HQ@Z zTx640Or9|>d94PDmbvUQ48>j+o3v>1jCs{-HBfZTHJ4#1cC^@}b(3ez8(yn{qH%7z z3`4bZZm~&AC(oF-y;cK7@7!@2hGKV%O# z&zPURRs%&NeQ_CvV%LjJ+DLiE?DoIqU9Wug*7z4>oBdZplHfbZ}8MBYqYM^MOzAnR1?0T_D8!6A2{k>KLMI#Mx8HQrli%r@{ zdBz;%wHhcIX|T&M6uVw*(niWN=1{NIK+#CUT!x|8^&%6`m?OLvL(7ag(q#yW8FLhy zw2|_RIofMAP&CpQmtm+j(s(s}(=uaDa7q=?q|)3rkrT>;C*|9;okSKrM7au_?35UX z!s*dXB@61dF=I}1N{mC-PUi&Sv}tFMMT=Hu%$ZJ!acJ3DoFJTb>};}V#mbC1 z$0;!mSA26hK{##Kd1TRYl^JusQ(_#Nbpa;`r@gw6ELy8FV=i(^j6)=i!eC3Hfi~XP43nuU&?qm@(h5NgFB8m~XvS14Sdfa~XzeBX$2*-*@=_m+w3O zlKxMJ-~Ey{bkc55V+iZPg5$YN^7kbFujpP=xJ}z$Fm(M(m!E&iB)R_U%|a!qWD=j{m1mg0u~fz56y-WY#{}NRUCp^ zB8JWlRQiuWEoGsJl3&qIm1HxCw2b^hDh?s76vK~Q8ldm=DU+pR6$?tjFM}tN%_P!l z@(ZargtW#OI{Z!#O4g3GPKj8WO0adDFtmn8aO;ib=RfI@$pW&$DG^Rn3Ad3G2G{Ti zZd0+O4$M!O^!jGHy&9#71lnTV1=G+4vbD%vQn6)<6!|t5sxinU&UW$_kT`_2qZk_H zmPyjwJ6WhEA(KeE$X`g}5Yp~q==_&&zyBv?NonlyQZ=oaOT4`%FVMUJdCqGQ5y6B!?=prdE`eUkrVhE5f7Ew{oYc!+s$fzsF|W8x zW;R{IylPD8*#%V2?6npxqLyUBUiT@(%{~F&Ft${v083flY|$ccNha_upEBU=6Y%X~ zOBD;O)b<^xR6|QDA@6dc0JBGM_ll)awBSjB-}h2Au$fE52QE{P>JsL|Vro<_m{R4B zyj0C><`VO<%M_-%g!!bHa_NF9rT(;4tmfKmB0p=%6?Sn7{dqCw`UPF;{Y9%-O}E)Z zf7y~N^x_oyt72>vGT2h|uf0@FZsrpAjms3Ox`g@Gn9AGlSAQjy|E@)gs3n=O?|sT} z%^UZFv88^-(dP31*dj*c5>4b!K4r++Cx`sm*ius$vXs@A7BM21Xd-|0DMQXaA$R-h z#;(YZsXM#M^-4iYU3G6&BX*QD-fS`<$NLnh z#V6ni-uBC{?T4`Pp_EAe6xPI+OuI&=eci*EgiPlSfBNM|or9&}Cp)F`;F_s)Xj3?W z15=M2)>O7s9TeT=H0Q54Ao5SQ{-6J7FV1IpNe{@sI{x&F=F$<(bQya{4VN6#95Ma) zyC1uz6PW(feAUl&iV|DjT@+5-c^njM(<9V{Vo9%n#tY0a7t!q@(F7B3u?-0gy0F&# z^$*|5d#A(ibWd7}W39beNqRQfp9t%W_g6-h`(F?7yPrFDRDzW81{NwAC6g!{$q!C; z2x$`xUCW_J^=_uyD>+Cc%oghgMRb8|EpnF*ov?}D*iqlcf?{+}SWik7rWaxs^o8Sl~lNQ!~N%P|I|T`InUuN=rLK&C#I_ACP z$1!Jz9P>UhR2{RuyZ!90IA-fU0QXPd{`7l23c36`$bue)?my~LluSB`L*&O%WQQEZ zVKP)5g}u8Y?5;Qp>psfvif7KckFook#`FAl^gLVlakzi@>D%%a%Jb|AC+SJzMrg*; zSvtuHoF?_ic{*h*atViekR|wZs~S<8;RHU@k~3^|3jQpN9e&qdHz(v(ea_xqiPS)X zoi|=!8ma&;Kx~v05Hf9CWTg^PLJ4z;`~YQ#pf1CZnhGR&abF>!5`;+NT(xdsL>J1n zBBz=HMy84DtSG0o{Unq?H^^T|a<_uINrtNTP@_z7cemJG@gB17+w87*4_WsexEp1n z2i;y4mb9w&)F##!WsW+`^L~VxC`Fz`wGi-GV{(~61{JCrA9~=L| zE&o>=SS|rSR_d*fq2eCW!}wH{mPg|K@?bt!*!6Ve(Y;dt|9dcaGQL)&D;|s%caQ(Q zvF!iw+s^IUcW(Df`v1Rgmwqr8;ytSk`f$<=&|G7y?j@a`UX}MC52+;~C#Y{TkghxV zG0EGwU$r58OzvLNW9nad56#D96Y`h_A@FzAr)hAdULFyhB!3s_@eHYoslVp z^lC$SJT1=}-%EN#Gb--^59$A7?7iN!Dz<-L{ZF{`=9~?POWkLm&~!J#Z#B?QcPne{ z8~%fRF3!!mLJY$X;qiTez+4?-o$JOKesc+SoHLJ#) z?|kR0eX&n-9FUG0y|_28=&V!R40LKv?Grx7Jp+75f zICn=`Vv1H;IS;MNdstbl%Es$^!%aYMR_Acro0OZiLEb;E*Zt+Twk{KmJ(1^`<)I_L zcs6uHX)z@mSjuaM>cqxOw9pC7Lnk(QmOCM|*omzug~wZ?(U3zY_G4dDXo(92s zyJ65*sL*tW7Eyr{9(UboV>PB+*X%NkHl=Fj&;PBdv2P!I3bdiM<5PYL1y9doE@oUk z31dBOsV>$5M|&d48{Dt+>) z6gZM|QSe{z++ZjK@g~K29mqQ|15Ou|K02WSoi0W}b9;L*!o~fP`g`7o2(Y;<)zPJj zqsf&RZf*Q$yv2;43|zILyj9}B?V4etA*s;wdKC3;kCu49<%Wsm9U}#XH#HIcf(Gqw zMagH$4)49(Hj%ttq`>ZuCZb)?pxxal=~aDd*0oF5|8%YX>DIODr*Mg@qun^#9i#VS zw7IEoLVIBFfeJ?QBMd%_!A3r-!|l4iR3JY>LSTH4q&kkSisRTG$8dAMhMq0-FQ#$>y3`&)5Q=B;H}cf5ugHxFzA2hwYMcE3hy6$t^#=@Lcr$> zsg5>P99;&-aR25O8c-~%-Tv=>jpC|%go$LlBn4(8 zH4)sR2JJ>g$!Ez9Z#j%Mk-S}`!0szeM7y9tyRW09S3f$FaLXE_{+_oY0*tS$BN z(d7FOZtK%Nuvc3{-{yhUf2EHu$L7KrOUHxrxC|RQpw-xq@kv}g4;y=d>7C$%g+2%t zdN9#($)A+*yh4QU*5gZs|AM}&%Uo?4?nzyk+D6?2kw@lWr(`@2wb&y$e<0>2Iubba7KKU(kGWjT60 z7tSQp@sQ0E88&o5t1+J^leo%BAMOR7R;PTh&`$>*$WB)ma}b zxC<8C&p9r+vl89UCt)~((H~E%3%PKi2a1P2T+Fbk7fFr%xRk^=L1H)Xw7Q&$7J4CR z=)@IIranY1cHw%G;zrQkn3QzH-g);{5H+_~la?n6)+e`3g!&ghtE?_!B?g_lqmf`2 zHQ1@ULej#1cw_sXi4^?^1Hbzk5q^~h{T@gOJa3J=T=-1pp$U}@0|$nGX+#==1`Qtx zNiQ}GZ@PGFLPbO3!0?GigkhyY!{;pdv^s*HihcZriRAqf27WI!!hWPdzgI%i!hU!J zUzd(Y0&Sjlr+=$!Vw(w-|${Wb362}1wv)Rz=7fC8j*&f0l2jxB)!-$ z9KpdRR5TCk*klvPjIH#W5DTzr!Y7gM2| zfKGgy!DBy!8oTnH5`TuPt5`q2&xC7x5?g?djP0iG1>PiiyQ)fn*lTC?YRwt%aju5NwH7-~fVM1YqKU*q|kaRf0 zwN{oNp=x@aW3nSu%rA*)qEwn}xffjGKsli|XlL3e0syVB+l z32S!=+ zN#aN%`oe(>8&UY0?NJk=VcFA{F&NeFnn;5}4UXxLB&jA?@WYQA|1^<;9aCU;OcTit zHE4G{NgDgW=jvFk;hJ&6L<)9Hf!#?>BseCk7@I&X*IzVQ2;UEUQ&M1Ad zsubvSRtfSmBQkFn)*gRT(R!hP{A;A;CRVZ@z zAASqlBMSFxlGntK#b3#w`YJ6wjES`d0pRc?iK+c6hC_IoLgB2c9>U4D@=QqalmaPz zpE}gv$?&<5Vo3~A{=TH?+Y2GZ@0);>zj9}!FNL&6_0_!Ud7*q?UkT|4K?;vwv{Wzm zvVDCmr2h!g9tG(eA^k8&KPpJy3h75EtsZU4c3@D~)TNJ6T0Q5Km3}Uy-SA8BU8~2Q zvf3}CHXN_&DX6S=u+-uKgWeXjL!=gu7<9Lw9V)eW$e_Cg?J%juV+P$VXh)D19v&Om zE1vB5xY|e?%AJ0agY#pQVQ7v-6`m=hrHE=wTs^Tzjv`xrXvZ1A8RQw{-DETj}x+99lb+o zfotn{6CqPoTi_T11(p*uAq=aQ(Qcxalu{m>oMiNcq(}W!)VEac@q_)i7v4I7C;oB5 zPO~weMh(J{rW*#wBvd%48A$}Yax}#PZKjPCOd|-Uvka3=g9=S&ClTz;(G-iRIW|@> zjUbrLHB2%MDm0y!MAhybUGcM~A6&3tn^5rm(Nf8nbm%-k$zUCd#(07(u(5(~1i^Np zVUlZ5q3NO|s%8`2F$^zjUuMaPQX4CnMi5Mw877$q z6`C$jqUvyyX}H<4!o~`w5d_nfhDoMDg{G^L2oE*8;&s$&7cAH&6nxiMDjAawoqtZU z>Tt6$p0R6ftl%3#uw7@Em-)yMh89DIW zYnbF2ROq=ciK;_Qp1AVwx1oY(TNuEK4 zo=1`h4>OtKPIJ`73a*I++utpfd`XAKeiAbJ!Y6>8dT_c5=Fha zUQ$2kaLUHKsRqIHv|-RxsL=FG5>>~VP4SdDYhwk|2!iQ3!z9z7Leuj}R2^(K4L6@` ztY8{JFuiD)WExaxdMSzUNV98rHpc}Ewh0B_E0#*eq(kScNmds9HGqH%V}ZyJ=$u(+Gm;EyE98u zIGbMCSiv-cVEWoH$uy|Y^i2{~hnq~XUV3Xo1<%NV=b&!YeXg+TR?Q{PphC~jlL(JA znc`gf!o>=%i3HohmP)>)L*pSyRvm2e#i=yZh6=Wk1J_}ONv1)Co?j+Wb*y`Y+Z?#| z54WL$XXLK91uHy`o zOoIwNC!(mOPj%y~u{zl54$~wb^~M$k>&cEobEQQ4DNwD+y$KP^L(_}g9t+hesG-h4@$KEQ3|X1$G3-YSDf#oMf(VY{Q}2H`=CVog;H2e z47SI!Zjp}`?IR5KiybHJgA(n3lEP|Y@QoYXDwp_Z(LTapztnNkJ}A+CnH1urV1L{- zmuJGo4kR3Uu)>qF3#7$9td!DfVsIC51z6>y#U4Z$Ic z-{?5$9+c?5NeXdJkUh@6&6#M?Khe;EEuNG;AT4%btCUvLf_i|HZ<`MmI}lm$-|jeR zAC&06Lkg=|LAOY7_u1)#Mfb>p`!2^x_n<`g-BMUh3UbH2XO9mS-6IR`zd2622PL}i zmBMOLkUQ3P`+TtI9$9eT?>Olml<0my3UNY^J??r3Gtr`dqM-waJSlrXTI|AMDXk_2 z^#ITOBR*K{KxD!HsNBKOu$HtYCXQ z@lN_^(LTapf68&vJ}A-tv=mm;g6;9lJL988`v`;mS;tBHphWv~QiyYc{qfv8p9vQ` zkZ|b11y9N@kQV!JQA(?c!Ck;J;F6CPdk|shz-7lt|DZ(sD^gf3N_?9O_uZ>LTC|Ta z*k5y;v=2(Ozb=K<#9(_o`)>GX(LTapf75Z&J}A-tmK0VKgKt3L#(UdGi}n!)`#X-4 z_CbmEccl;~1^eU9doL3%b|B%pLEJt)!rwG`r zrUmr?C*S8jSnNP#!T$@#N&BEg_rX$F%?i5JgS*cVA1t~@7TkwAPPzvrx(}1WYEqCp z?mb`nV9`CY;6B`O(mg2AeS{QNlY-o_?i=ZYMfb>p`zXgr_n<`g(Nc&Lg6whE`zjMH z`X?GX@Ur% zTF2ej!c2!DorFm)S%sJA&FnJz&&z}iInV!0=u6zA?zv*+N~9m0X(|!6{B?~ zRPrMX{C?4d@T)ZF_iK_gHpFy>&m-5{Siv!ZV7b9C$up?XbfXZ#ro`{K#CfyH#!99P zg6U?%2vby{=@ubM1H~<8s|l4X2?NJ%nh=JS2K}}tN#FiWJVq=oc9;--dDtlpKucfMIAzQH5hVC`C{s ziS_J|4HZ3!1JA>Tk)D+bJ&#Dy0QSVWdDMoAp2UIY?}m|{l?pxo5Tfclp@HJ${L{rs zu8{=WW0n%WL5If2rL3wCLx!;oJmF$RVd^RlwpH z(@KS&7g!WN=!~vdbzStqtgm9h`I6(&!*SX@&hMK_*w7pYk2CyMCR+B7G$jAFCshxE7Sn%6N%3QDG1u>AqUA0` z8oF@Lld20ri(R;{rE&h@tbgExH62JZ|DofweVqM|qY%DF(pX&&DPi>oxOt&PaGbOV z{s0d;X%QS{ErLJ1^X@Yx!X-zk@X)~R3N5P^2qnYx!DCKZW;@@Aoqt23UZ3=>ihWt@ zzqKLCZMd=#*EX>2NgNLFp!Y+e&3~ru@&64=%aAC7Usq`9FZRZvCPK#I#Y0%e_xdD) z;5ke~(K2XoGL0ljPe0gEHdHfMiG%TIgOYPpq4hUW6#EQcJgk0}^IH=s47R5l>~|W9 zmSV8uNz&^R_y%ett3ip62Ul_>OZnx#0cxcyJhL@BT8GBpk%(9rG-Puk3a7E?RZ zNX3ORu8Om=@w#rr7N8@ubF}G7&|_!j7iD)d^7?K_VXQQ>_Lh43!JcKmdEB7da69jBelpz2xejlV zTAUTsCcJ^$fI}PWM{V=e`}`9p z)yogy*%PZ!>-vsNlya!n^=KT|^_`xyS>$znmyyO*xyyUFuJ6vq>$(wJfTOu5N1LvQ zb^SLZSL^y-ALJR8?s&tV8`Ht-`aTDm9`L%p-w4Ah*yX)&LLKl?@>lCR+s7sJpyP}^ zD4`*E9K{K1W^`=+u&2s1I#Ne0#cMKrT^);xqgg?1!sWXDdk(kbPV4&dC{K%Rx(R!t@TM*itNAg}}}5{w^Oij0#EjsLQ;%=w>?u%SJ2j6eG=^Vl(d zH?z!3X3|*`e|4)X6xQ%Wfl`F|%#vQc;1w_MbtEOJCR`9yVHCVkg0P@ek|03I=RLwz ze*e^w?r~S`R(0eHr3f8~k`J4!jto|ksv|7u6@Ef&m=a)}nf7jU`BEu@OO(8iF2j|i za$&)TjX0JON)U$25_~HTT<0qZcBDrfZr5tKUnxcCNRsrbhWoXWR2_+eaA3wLLFfoe zs$&Cfe9sbhPL4H^nlrM0g5k6nr$Ig`qIOpg{VQ5ub@s*r&6(ZdDrJVCg z&@uq-dJPbFy%y*|VQ2}1p)FJhnUMmAwuA%?eLLV55MLc(CYRa}8LEO-a^SbjFyt6j z=(${p_#J9^MYh6*;vnVG3(W-(OjjC6netoJHuq@$S4W?Lefq*p%r^N%@D?4=gR~5| zZB_a%N`b@MCI$SpgX%`!b{!}>Ap`myN-v%0HPt(%fWF>=pQ-KAfua*K;Iv!mrBnA% z@9vQT`XUp4%K+y>qa5}8?(&>ZXbVLg1aZJ4bbW{h5PRM}M?@BM7{t=x1kOF$}7#}?UQwNGp z$bi!^rI$`02B+gv@R7KucR~k>PRM}MNu`%g9|fmVQt)wb!e>QJ>p;;78E`tI^wR0$ z;B;0By3ryLo)bA|LPfKHf!ldaNITE~4^NdV2`?4++2utOD*N$jaY+-(kJgLJNn2q8%`ne{QAFVH6CazqGWdZEe(=t_ z-^k!UWbhyGp|T8qD1#ruYZYYhBN_Y%E-q#8V;TGy-X$u7@H$*Ek-9;S#;LGQ5@cz- z3ad1AgFH=8VU?(Ekg16(tWwntay3bXRkFH4wkE5vN>?|?*Ax|23F`(Ko2tSpW!)fW z(^Oa`ts7)*x(s($S?dm2o1wxgYuzDhGgVk+tvh6GmI|w^b%(6YkzsMMIamFiP9J&S zFdo`I_>n5CNb@9;4n4$iHJTs7&F%_pfevI&Rl$JILZuHztU#wlQov&S5>QCDCmOsMR~YspDXC_h?FPAQ4H0y}L&Wj|g~&S*mU z(VB8rNz@hCITI@T@w#$e6UvWPmJ3RvuD~vuP}z@HmrI&Zezd+^mJ)phcEyB>e(?(I zswSi#Ux8gy5?Wuv71(tXD*N&Jazhi!kJgu)O2P#RUV+^*p|T&ZFSj+J{Ahi-qa?Jx zge$PSCRFz0_2r%>lpn1x50j*sufVAEgYT%zAeG4>2vzbU8KfdP1ffQLEQ3@chagnQ zPh^lTD?$*iDxS(9T~vf1TvI%gLAs;}LAauLE`xMI5rS|%@j?daav}ubYT~5~(#1pw z!nMRJ8RRRl5UsAjUaPQ95@hL(3ad0#S72{dSS6~u0vq%XyeO#Ln)`NBsj9BPK38Ft ztm+Ev3l&!Bs;I!VQ z3ahMDS70MlSY@rc0{be2+d8VBqG*#JO?_=5nNvtoaM>|N6X6t!8sOo!fRb>@gAbaU zNZF28r0+DL>}W;$UP*XGs_e#^NZF1Tq;Z;1cC;XkR}xx~@H%ONiInYlJ({QqWk>7L zBqfm-OOs8cY{%u!6ip~QDtD$TiM(Q(W+G)fu6CwtLfKKZGeb$_Wz$R(Dcf&#OUc>(oo6>6Yvlgk#tF<;(W6CSeI>TsF zT62EUB6W@RtBuu|^18F$Fxr$>o()>0F0?k)tK^nwA(P+lvboYN~ABoezUQ% zX}tW}YZzt97hwCeh*qR<1-9SDYD{@WI$#)WN-NSqE#jgFFT)PmSdA&KNQVuhO=(3s zqD8bKg=?{+HdbTGE7I?V(WbN_9SfpfzIHusA{j?XK|Odv6TvTPfQM&Al!UjJs+c@w zB4s;1lBYGH?C3b2Q4&6kmEBnrDckWeJf{g|M@R6ylF$Lf+Vz5ol}aQWtR%X2ePUx}$5^{QHH`A)+VzvJ2cG3E8;g<-TQtuQaOh?ba8yS}oq z8dF|nUK>W6(mL}-i)f(iYS%Aptj3gA zoWX|CBc(NGh!&~Zb*PQinDV+a%rM%NR-P}lNY$>xZLG$WSDz7v(WbQijMO4kyN

sT8ro5tF8oMDtH*RJEWh*qRfyH2pN8dF}8CK^VY(uy=mi@4~)+I6yx)tK^%G{rF5 zlvbpvT0|>Ss9mSoSdA&KNYf3YO{xBw6-4du+BSHZVD)c#?{#)2nsK%?)P{3B8T^$N z+Jc|bbyD7Tsv>hhrH^-{7kgI3w+!cc+z!&j{ZU?r3rww z@1jh!z6(4H7JJflf#$+bPAco+C7Eb_7kHOi>PgoH+N+j1sjQKgXQK68;5}=FCtVk4 z=UVBcvTk0LiPm?4cd*r-bX}l*Y>ku3TKeZqw7v_xpRM(z>jLd+>zq{9*S}<<^opglP(myk-?+C4?$GliwCmhekJLw3os3$V4 z?+C4_C%sr*JDkeJJLw3otEV%p?+C4|XPj7HPn^xg>pK#!E6!zD*Ac$HIPb-@vW9Dn z3%PhF9pRPrVutk{p_TQL7jqGc*BzI0@lHCzE9;dE>pMa#>s2qNl{H+8T+78f=?Jf^ z*E6i|2(7HQg1EJ9V5_<+xvl=5aZUtO?{}m+cu^ck`2AuL<}I}<`tPZ~mrVFb--%BQZgq}#XFrj1eRD|W#!87&u zk_qo?&!t+J&`$P3gk}BzQvJPT!h6;$sTL-*OT89hS>eA?e=nKve)LwVg$eCIgFeE$ zf;i!14gb0Nd&z|NnlGeUn9%MrScGMjK1BV!WWxK%P^lIsv~vs-VOfWNss3Iv;XPuw zR0|W@6-J1#uCzz$NXaKw*Q1nPIB`WiS_=5Y$6ER;9VuGzx&O7&ODj72$4CL4{-Ij_ zMn{TPyaIfy^wNsffbXP$7J*O?f3G7&D_#f2D!sI#m0+9{sET*IjufqUHJG6E(u&rD ziBh0y+DST6wBj{kveHW{S{0^9fvQ@k>PXRwSB7ayFRf^8m@WmXE}fwxMJrw(W-7h3 zq7`D66sXE`wvH67c$Ju=^wNsfiMdjsYRh>#Qncc=;s>RdRv|9Wm1zap(1-L{LwoOm?ahrH@CKuf{v8c1UEq=AP4xE$c=1k4Lq~JJ z#(#_NUvADssW0>j#n7sup|aZI$u3?CZNa;2ymVmK0qyCfRn^<1wq-=!q^KK+wr51$ zrKmfIc4S2FOVRrv+L;mckfI(S+LaM~AVnX5Xm>{R4=MTwi1uVeA4<`OAo?vM`bdhZ zH-zrZh(4C0k3qCABkHD7-TvQdw^T)uEh9rM($chjS{G z_v$TYM}(@itryH}@p_n}KB!NzG*uG|v-)?(iAhaLoYQ{@A^boTo8uc}{&caDcO=33 zn5Bes(4p~hEo*D<2*VD)`*XraYrF{t^OKI#?v)bl&yWzlMbO;8Rjedubs*=O7;rqN z^yEegbUL2|{ac&c+Gv>7Row*}D!4@sn2UxUf@>nd_KKyF zFX_61~VK&KZ;(3hRCZhEN$ z1t(&_>6Owar%HiNuals?U(YZmyw&nX2gpg4Dv%mt!0D~hC#On*PJ=!UI{{H$Q&CcF zwx8=Lzr3_-S9o0)e3eW``GuifyTZ$M;G1MR%5U-P+OpVy`NKDcN{!XSfBRr{-wenKb97DLMRj=D?Qb&%*J*<#2j7 zPMuL_aTuv+0Xj1yN2|`T9y2pDC(oSOIjdP&)}P}!cD7;%3~2fUo^A?Bz;bC$HeNm= zq6J98+#Icvz9&|HBO_yhCrbgL>dw_qx_WYaH}J1wkoO?wAmQf&2#f1m=pQ7N{0 z#fPZCZd8ixN)gt-j<}kUm=-Hlp3%QN~gZ@u%W3*J`lXWB%zK~@5XZ{muU(*cc9RW?46{r zdk6Cne|Cpk*P)W;@AZ#w(jP7~lkXqhxIg)EufB}~dp5Sg|L^%vzU78f?UW5scX*09 z4svwbFkMXRn3FR?^y$CY6Q|Hw8!CA+2cG8)BRo-sp67+AKeloac;9neGG`^a-%r8;4ShOV`_s>1;2rM=K3H%UEVw^(Tyke6y8k7FZ4IsP)9JMR z368uWW5B+!rOh_~QgyI{#PqTu?*Qo=Xr(D`kW!E-(7FynGD=)cDm znt}!Ago5+umP*d46}Xv~WDV{A?$=mNKbm8B2{||yFZinlpbJAXZ0bc)V+w{Qabvv2 z$3HnY%mt|n^lMWwK?w!_FD;eKNr%qEtt`KGs-{OcCcAzrW~5`}uTABLFiJ4EF169k zhVUZw(V1}J;4}&xa`TlZMRr(=`T1H%8(U%l5?-x7#sy3M5e4^eEG4{y4xPVEvH`uC z`m~3M8J>^$&c+J95d_=s4U=4h3Qfne2p(oI<<sOzYw#h_oYIZDkeA)vD{kbqb2(UgZ*;H342*?tq?-khE2J((nm}72?qOBjuZBz#L=%7 zLQ`(7F`<%iDz|>tgs_a|)> z&ItwQ4VFsIvfSF3WU2na86JMwW>YR+@K+5$7dB_u)QhCX6l_W2RHSgZwbccw3%cCu zJ}{x+zs*v~oOI~C-OBQ7r)qkKW3ua~Vs<(vQ*N0d>=F#uK;h`%0<=35E*u&+?6+!jK85b+eiA2JrIBTgiELne?OERtuQvGq>2MgAM z1@8-vOXjS^v|da?t_)KBamfb@?t%sP%Z^L#tVH)KLYPVju0O8&XvsdoV1LbV!d})N z*M*P@gRuDFecu~CTCz_t*xz)VuqP#s{+1A$`s20BVu8+16*2T7KS2(CXKx?sUMq2T=KABA3sM(!{qer8Kb~7Enald)g_Y&k&eSUy+Dpe|*H6W~ za!jWFFhh7P7%mFJ(ZTxTO(tA8IHvx1>q(Ivw!$Ox#s5LKqTowXrv4agLs@gdLF$GW zhHY7eojR2r77KgJ~)R|a?n;{A{DK3K38EO<|FTry`RrgdTxa%F(-c=}KB z!GgPB!F{shk~=HWeTopK5`ycGsXkh=PcYa|bDXf3^~ZD}q{1L9epr9Z@X?Zeg28^K zW?{^5SFq2m@6cqI0&P~`eU98mOLX0WBtKW!Z+w}q(3HE zDk8Z4nD2rG=Y)du0!t-lS$`}{vQ!X+VPpNVC>JmIs|KJ8i!*HMMN(r5eoErBYjgdv z#09Afy8h^)>yM?DO6IcuSY~DUwKMe!hPK=>+4WN~D;$%lKg^c`Cdww{mdJaRAkiB0l6|990jeoT= ze_#XxX@REKJH{Ot$82znJ1~yf=oow;lAnjn4ttYgdbh|&P&T_*Igv!dXt!8OC9=|C zBDY#uF_Ee1ZH_4=GBMj7Q%YoFb~vV#$i(bSOjAQg1Ap}pD}r4v#)-63GNF*k-4;uk zBpqgQkClZ?#>aH|xU05*a}cI7KBk+6_Bsf286VTlLi-$~AJff3`yHeo)6GH$9Hbx9 z%|Ztqq#x7GLWdlrAJff3hZEHE)Ao)}+vrQV;W6DKKFX7Xo@wMp1q_qqsN>QsVI@wJ z-<>dj#xWGuu0K4LJ?Av_r>C-Kou-a?Dtq2(>Ug5yseqW;g?H5a5z%6kX6 zxknT-dEHVelVpLJykTYeOr~Bz(>EQH&7@-PFw@-^V0T?CJ5?kJy|`y79$?hr0PkB_ zZh#R9i`WClWCm!MhmOfi6~p}Hn9Ni$%p=86JwZ2R9=ljMk*N}SVkwo#N{5MjYGuVl zrly}crj*FUJa%h2 z(iC8(?Y9oXRGI?JK!g4V-gfP1i+{&lngT2a!|eauL72?=J*iMv80ZTJ6Dtq2(>Z?Sha-z$7;nB~pU9gbUghEcoSSqEIbePd^tSp~U z)%3TH$)-~=-#I3mOvQZfm~1K)Gd3})oPbPX0XEJB3zne3QsCKWR!F{x~UOkx2x)deY&x&VWXS{7i_ER`}zI?UvBE6Zn6 zH9f;I*-R>CHZ$-00&I?pWv7ZHVXDlv6b~@!aDelyEH}W2ghlKJ$7BX*m>(UJnJR{v z@0iR~G0XzRP(48f*g_X8Co)wci!7xQS?Ms5i><7f$kg;tjwvNFF-sg%N@QY|I;ND! z#4Jk;oQt{uTkc|g@)n?031>om2+Q`z%QQ(F_2$_XyOwz*&-sR@O> zV7sMKN=b(q-Cf>^B!IWHO!xv!3T`W6QBneaHgr#_ZQHKLOX=S+qMkFj^ryP?R zpkYosCNotGbH*{5sbZM3ilKUf3b1o7R!(H9M9y1EC9=|CA}?53F_Ee1i;gKJGBKAN zQ%YoFE<2`_$i!Sp44jL)0K4j9oJd`O_0R>_HH)Q8k_Be+x|M}YngYzUeZxVRN>hLt z=%#}(m!<$S&@BgHGED(ypxX}06<`Lshl|AP)_1II{vrbb_Je57~H1#x5shr>f z?3oJ|lA2K13!YmlrId7-(HB;hPpE48rDL+`RLm>KWRt0w*N(}iQZa85lgbG$z}~uG zA(IJ(Ob+@#>7F^B3-GCC$|UJ9lb>5zK9j2HFC3H2q+$j;CYwpc3~@|0lZqLdm{hiK z0XED9DU-SYgN<4iU|(7)Ws-E5$>CO(&!lR4gk!RqRLtnW4A9R(!RykhmtKD5gPF-< zSm3^PTo|NO;wZ;Bp&zD%!dmu?r`$k2^{uDer18{uo^sR1Q{QWfstYQ|#`<7QR#Rm% z&T%@cl@hZ$-U-WDP0dg6R57cGn&_!wRueVJQ^l+%YO3L4iB(0K$7XsAGpoupkInL!FVs9X+he{| z^Vl4Z`C`pub3NwEHIK~`m?$~8VEZ8x=9wcZHf&emFmrzNq?kIa#kn)zOAF^DV_~UV zkm2%YrREl9xcqskxkVW+e`acKvEb7F!aLV!I0o3juZJMC8l?&6Be?o znqTIrd~OxBGE(v(6xuOY`Cxu7Nft)B+HrBDQHdj6huG}s=GWp_-2{pPXkj%l#H9?R~S2HPhvvCi|3xjz%;nWJ}1`4b&ss^*V*DxX_Los5)xYJhgkQ$CoVOOk~h^R(mQNTU)*dd3N} zBaKj)MrS>h8>ykrc`7%D40Ya9xfx`r3!0)upLWcPK3J30v|(IwoX%>c#H?O+!g5wq z^H)4o%xa>pda9V!L|yY#F{_EXE-1HS-ta-rs@XBkXZAN8DAFo-%v(+v(rR~1)BbIb zVP5TyX|OvU%kG#4yX&#+j%l!a9?R~S2D|UE?2c)$2Oi7rme5l!{yIQ%{|X>`7={n`Y2`C?3l2O${q8S<3xT*iRpdqgoW&?=HGZKpIb$J{(s@^cDN#zAM?_V`GpVW z=aOV$#~kdqIMS%Zkq&Xf>_{UNrqNJOK2p_D; zYT7VHI!p+oKxnq9kgdweV$29GK?=j4)-7yU|)??Wn(_rH~mfbN8Hr`{|9n)YFJeJ)t4K~qZ z*&WkhlRTE)F%33ZU}Bx;9dk-1%ri&tnD&G8sh$*5hpq6GoaUv4bCR*J)J@ND`Lj}U zGcsKMywu#x43|GMH8)FeX@B7zbGDCChRu!%%c$Hj=QvK}mz0>^xlUNfu4;asr}DW~ z)O@5`tDh~cUbGWmaa(q_s@xlU00;*778vmqpP|xk3lXNz9p$BY1yRI9paK zeR7I#xLTzIZjPAdR%^AL8%Dh*s+-MEsr+mr`HV#h4$oRm#E}FI9-ehk($UyLzm1+)+<3aX`;CeTAfRpP;b;~yF{6;ZqjPIFd6mcq;B9J z6UGU=MFk283JBz9t5m1-KpeBPO@{NyiA`-++H7i~c8Aht6BD&Nl{TA}sNEH{FqvBE z=NG!+Zzk?GAfzVf z`?S&E@d1=W^3ODIv1lhfjQX(9;*cqd<2@3CEu7qHXE-YVoNqtqLHoPV#`YnK?f(&j zz4*5?s`mesf6lib^q@T^w6T4NV*AHqFupGhPnr|z?|Fyxss+pI+|2*9Ld=j?!_kfKC*M_?|BmXOq__r%=ycsYU%_n&YeeITAn=8<8cNo zP9F(A$$-TPB*CW{usDSz_$&h!Cy@l7XTah#lHiLBSe!@_e3=1@Q%Qoa6xh3eOB2nd z@J_7PnQ+ZyiaboFHy%}!DQIyrz4g-aWRf0({_pBmC!ZoAQk+Z@{5%5|CzAxf$biMk zB*DQMusE3{I3xoWCzAw+X29ZPlHjlmSe#4}{8EE`{wK|)@cM+|K3X@Gh=!Ro!hw1s zRZ5&kBb~5j8m0C}d8|B%5;odn^848QL8a<&lGZU?uI1z`LGs~lD z>I5y$o!MSmo;=cHP6jMa9|_LQfW-+U!Fd_5IE5tmLk28PA_@MO0gKZ}g7Y(AaUw}@ zK?W>NB?&H6VBFOB6NN>YaLr_jJWQs=9#xYmXmK+A(ZNS2ct>Q7kJe44v`zl( zKs}KvCC;O@PFORIQv2&XR-Qx&`^97BDU`5ZJyxDT30v>6^7KjA29K2|Pr^2OtUPrR zw#j4ViIcFch{3H*yd^7d25mEuIAMC>Kj}kF1;gsIU4uAbk_KnXE|j!4HNvah`@z-J z|NH;Zvm(27fIP)#HIf0ZJxY&OQGrgsDM6T%@{X+N0yMW*t8prJPa};@hiYt}RMTez z_(|G+9Vm_h8L&N|^l}vR@xVbPD2;-fJEYZxQLy^3Q1{iJoE@>D(ny$tu^csw7!9iM zsQhk3g%OEn|FA@URD$?Z5dC_FIfnOCkLdu7$xjMoU_{52UW^A?#nGG)g2smSV1=KB zoHUVA{)hszQ<@NNl?LrjYe^w@smU`&pU+&9w&Pir%|<7Y89U9gnkHb%kwmZhXM>d^VNl@$^!o4(_i ze1au&KQi6*PVztp@`D;Zb>QM1>KFX5UyM zKPo}I6@=PJ2K_(PyIkG$Gt74JL1>mK1WAnjB{I`OGE#mqM?0lHoc)gK>$AJIM&8?~=04JIP2Pi0dz0 zN#n%_IGGhdjHUk(U?j+y%Xep@)hCzPo zxGpKVawqvt3VAyKcic(7cfnGE<*!Vk<4(=CBl%01*&jUi@O z0xy!qFG{(=&XmNz;6WC=qQhGcvuvoCJK`XBvklWl5^a3>fS;?+x1nP0h=bfMFiaPbyGn(*TWCb3+@)q0S)!1;L@c&M zA$N)R$r6R!C1Qyp=te?V5to`!IdzCZ=9X!qi%eW&$lG!)DW;8^Tw(O3q_KXb(U(%j z`c+atfKI#cG5Tr~Dvm#3F#a`~=px1s8k{#jYe{MRvB|YYUl@PXuQU3>_@n+8sc)le z)$khxznV~S`~idUuh&EuF@DhC_%~=tY5cLtjYeM>f7EX>`oj35ezVdy(w-IW`EIeX zas~njDcEY5E;0w8!X#`nqGA?ev)e6E%0nb}SfZ4PNbHV8ce{P>v7vk>5(k<1%`ja! z6QsgS>@}inCRDTgERoBEBKBJ%mkC82utaVdRm4F_(9T2`Zij5Bn7g#29X3oCk-JKT zxjSM+rQD@vk6NOTyF~nMi9+rY@rNY}xl6>KlAxW5J`O%+L&e;s9qqVbx`^CWD$Lyp zBP!)CHG9$$h1@0LlqCweOT=kQ6mpk{Gm5}XjW1}HMj+P=?gNil8Q zmLM-nX%G2I3z0z%X584nT!TcxXh$EW~F2vP3Blk$7Z@QYIqtl!(T@FjxCG z(T!@H3eRkaG9kWE0yjzo2ix~^!*mImh$_s)3nR*8A_C#+`=up(CJgb)5{x?#-$_aTPy5k#V!BmdQu^M-*wPFVTVxo(u@;ohs6+2@Le|#Yhd(pJ zyIJFHjIHfx83fx2h7qo)Let44g7R2pcZ&LZ&MgvPHC3v~C&bZYS_)TdY&)IjnAPbn zMrP{ai>i8$BpA-HR5B$U8qc({%!y~4p5+*S>RD#CVdUaD$HnRfh$IYfuBFTXyNAol&J^G$>Xr?v)27gI2_1)4|$Lk%9cy@7D;#?v^ug-8Xza?&s|lQNzwm zw0_7)!;p7*(ha#s81il}tsOF3?8$I-LuT$b$9)in96lG`n+eyC8F3i%K2N$ae-OsJ z-%D%9%oYbST-}(NJLtH7(3o)nJCq66j~Q_o^I=cAG5;fs`G}X+j+rfvX1KaBGxxjW zKBO_@3id}PTt8;SVa$Je(vA7UFy>=kT03U8IG*9^#?0Ia$9+U&#wF}zCR{&e#9_>* zJn6>#Q5f@SFRdLjTb#*obz^4ktm8hWG2Jf|u5gnJq46 zxVkYjcgbP^`j0Az_71mST}A^Lv!!Edo?4j9eK35mLu!N9?9#T^K~xX$>6y-dXr)O z;Hh$Zn-SL!o^1y8v{#qiJ{VX#cqRu2vOm1lthsGq{|@l$`k$`hpKhPN^X?EE@0Q}- zAwJZ`yQg>$h!3;z_fz~Mh<|D0Jz^Yc=6Bv5ZsQ-sIBZAoy?Gn|M~wHV;v;SR!x;al zijT7Kk2v0~YZV`D;~#UpJI24V@oq7JJy7tq6T}RDgn}_nz$t_tR9*PS2{?z)g-Y

;lwze%N+SsfAAS!!69sw?G93))(_i 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 diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.srec index 573f6db2..912fb7fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.srec +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/bin/demoprog_stm32f746.srec @@ -1,7 +1,7 @@ S31508008000700700206D820008798200087B820008CC S315080080107D8200087F820008818200080000000037 S315080080200000000000000000000000008382000835 -S31508008030858200080000000087820008C9960008AB +S315080080308582000800000000878200080D97000866 S315080080408B8200088B8200088B8200088B820008CE S315080080508B8200088B8200088B8200088B820008BE S315080080608B8200088B8200088B8200088B820008AE @@ -30,16 +30,16 @@ S315080081C08B8200088B820008EE11AA5500F002F88F S315080081D000F03CF80AA090E8000C82448344AAF117 S315080081E00107DA4501D100F031F8AFF2090EBAE815 S315080081F00F0013F0010F18BFFB1A43F001031847CD -S31508008200041B0000241B0000103A24BF78C878C15C +S31508008200581B0000781B0000103A24BF78C878C1B4 S31508008210FAD8520724BF30C830C144BF04680C607E S31508008220704700000023002400250026103A28BFC6 S3150800823078C1FBD8520728BF30C148BF0B607047CA -S315080082401FB501F03CFD1FBD10B510BD00F0D3F8F9 -S315080082501146FFF7F5FF01F029FD00F0F1F803B428 +S315080082401FB501F066FD1FBD10B510BD00F0D3F8CF +S315080082501146FFF7F5FF01F053FD00F0F1F803B4FE S31508008260FFF7F2FF03BC00F0F9F800000A4885465C S315080082700A4880470A480047FEE7FEE7FEE7FEE7AA S31508008280FEE7FEE7FEE7FEE7FEE7FEE705480649E6 -S31508008290064A074B704700007007002075970008CC +S31508008290064A074B7047000070070020B997000888 S315080082A0CD810008700100207007002070030020AF S315080082B07003002053EA020C00F069802DE9F04BA8 S315080082C04FF00006002B1FBFB3FA83F503FA05F437 @@ -80,29 +80,29 @@ S315080084E00AAB0BAA0CA94FF4FA7000F097F81B48D0 S315080084F0194901600476447684760125C5760477A1 S3150800850044778460C4609DF82C10491E09040161F3 S315080085109DF82810491E09054161BDF830104160D3 -S3150800852000F0C0F90594069407954CF6E0400090D3 +S3150800852000F0C1F90594069407954CF6E0400090D2 S3150800853001944FF6E0700290042003900494089585 S315080085400E2009906946054800F0A2F8034800F095 -S3150800855053FA0DB030BD000000640040E40000206E +S3150800855054FA0DB030BD000000640040E40000206D S3150800856010B500F00BF8BDE81040FFF791BF10B545 S3150800857000F03EF8BDE81040FFF7ACBF70B51A4CE6 S3150800858000251A4E607800280ED020783044401C0A -S3150800859001F08CF8012817D001F016F961686431EA -S315080085A0884200D9657070BD104801F07FF801282F -S315080085B0F9D13078401E3F28F5D801F005F96060FA +S3150800859001F0AEF8012817D001F01CF961686431C2 +S315080085A0884200D9657070BD104801F0A1F801280D +S315080085B0F9D13078401E3F28F5D801F00BF96060F4 S315080085C001206070257070BD2078401CC0B22070F4 S315080085D031788142F7D165707178FF29F3D1022885 S315080085E0F1D1FFF743FF0000000000202000002023 S315080085F00948084901604FF46141416000218160E2 S31508008600C16001610C2242618161C16101624162FE -S3150800861000F05FBF00480040640000202DE9F047E5 -S315080086200746884691469A4600F0ECFC4FF47A7164 +S3150800861000F081BF00480040640000202DE9F047C3 +S315080086200746884691469A4600F0EAFC4FF47A7166 S31508008630B0FBF1F6002415484FF4806100EB4403C3 S3150800864010F814205B78D5186D1C7D43B6FBF5F23F S3150800865005FB12629AB9B6FBF5F295B2A8F8005076 S315080086606D1E8D420BD210F8141089F8001000EB1D S31508008670440040788AF800000120BDE8F087641CB1 -S31508008680E4B2122CDAD30020F7E70000C89C0008F1 +S31508008680E4B2122CDAD30020F7E700001C9D00089C S3150800869010B590F82020012A07D0022A05D0416A91 S315080086A041F480214162012010BD3C4800F500706C S315080086B0026842F001020260026822F47C520260FB @@ -122,349 +122,354 @@ S31508008780D0F81C121143C0F81C12D0F8001221F0C0 S315080087900101C0F80012002010BD0000006400406E S315080087A030B590F82040012C07D0022C05D0416A3C S315080087B041F480214162012030BD21B10468246959 -S315080087C0A4075ED003E00468E468A40753D00568EC +S315080087C0A4075FD003E00468E468A40754D00568EA S315080087D04FF4D87404EB01142D5905F0040595607F -S315080087E0002D54D005682D59ED08556005682C599B -S315080087F0C4F34004D46005684FF4DA7404EB01143A -S315080088002D5905F00F05156105682D59C5F307257E -S31508008810956105682C59240C546104684FF4DC7280 -S3150800882002EB0112A4581C700468A458240A5C7050 -S315080088300468A458240C9C700468A258120EDA70B6 -S3150800884004684FF4DE7202EB0112A4581C71046826 -S31508008850A458240A5C710468A458240C9C71046802 -S31508008860A258120EDA71B9B10068016941F0200107 -S315080088700161002030BD416A41F4001141620120C6 -S3150800888030BD416A41F400114162012030BD0568DE -S315080088902D596D0D1560A9E70068C16841F02001E2 -S315080088A0C160E6E770B50446002C03D094F82000B2 -S315080088B010B104E0012070BD204600F09CF8206845 -S315080088C0016821F00201016000F0BAF905460526A3 -S315080088D00CE000F0B5F9401B0A2807D9606A40F495 -S315080088E00030606284F82060012070BD206840680E -S315080088F08007EED42068016841F00101016000F0AC -S315080089009FF905460CE000F09BF9401B0A2807D999 -S31508008910606A40F40030606284F82060012070BD0F -S3150800892020684068C007EED0207E01283FD0206826 -S31508008930016821F080010160607E01283DD0206831 -S31508008940016821F040010160A07E01283BD0206823 -S31508008950016821F020010160E07E012839D02068F5 -S31508008960016841F010010160207F012837D0206896 -S31508008970016821F008010160607F012835D0206870 -S31508008980016821F004010160D4E902010843D4E931 -S315080089900412114308436168491E08432168C861E7 -S315080089A000206062012084F82000002070BD206845 -S315080089B0016841F080010160BEE72068016841F066 -S315080089C040010160C0E72068016841F020010160AC -S315080089D0C2E72068016821F010010160C4E7206839 -S315080089E0016841F008010160C6E72068016841F0A6 -S315080089F004010160C8E7704770B5044694F8200082 -S31508008A00012805D0606A40F400206062012070BD2C -S31508008A10022084F820002068016821F00101016025 -S31508008A2000F00EF905460DE000F00AF9401B0A2889 -S31508008A3008D9606A40F400306062052084F8200096 -S31508008A40012070BD20684068C007EDD1606270BD26 -S31508008A502DE9F84F0022DFF8A491DFF8A0814FF046 -S31508008A60010E09F108094FF00F0C09F1040A0EFA74 -S31508008A7002F60B683340B34271D14C68022C01D020 -S31508008A80122C11D1D40800EB84073D6A5407E40E72 -S31508008A900CFA04FB25EA0B05D1F810B00BFA04FB17 -S31508008AA04BEA050BC7F820B0076854000325A54014 -S31508008AB0AF4391F804B00BF0030B0BFA04FB4BEA37 -S31508008AC0070BC0F800B04F68012F05D0022F03D05E -S31508008AD0112F01D0122F11D18768AF43D1F80CB0EE -S31508008AE00BFA04FB4BEA070BC0F808B04768B74314 -S31508008AF00E79C6F3001696403E434660C668AE43F6 -S31508008B008D68A5403543C5604C68E4006FD53C4C7C -S31508008B10256845F480452560246804F4804400945B -S31508008B20384C22F003052544D5F808789407260F13 -S31508008B300CFA06F4A743344CA04201D100242EE0D7 -S31508008B40324CA04201D1012429E0314CA04201D186 -S31508008B50022424E02F4CA04202D103241FE046E061 -S31508008B602D4CA04201D1042419E02C4CA04201D17D -S31508008B70052414E02A4CA04201D106240FE0294C12 -S31508008B80A04201D107240AE0274CA04201D10824BB -S31508008B9005E0264CA04201D1092400E00A24B4408D -S31508008BA03C43C5F80848D8F800409C434D68ED0397 -S31508008BB000D51C43C8F80040104D2D1D2C689C4359 -S31508008BC04E68B60300D51C432C60D9F800409C4378 -S31508008BD04D68ED0200D51C43C9F80040DAF800409C -S31508008BE09C434D68AD0200D51C43CAF80040521C90 -S31508008BF0102AFFF43CAFBDE8F88F0000003C0140A6 -S31508008C00443802400030014000000240000402409F -S31508008C1000080240000C0240001002400014024006 -S31508008C2000180240001C02400020024000240240B6 -S31508008C30002A01D0816170470904816170470000EC -S31508008C4001488068704700001400002002488168C7 -S31508008C5002781144816070471400002010B5032083 -S31508008C6000F0D8F8002000F005F800F025F80020FC -S31508008C7010BD000070B504460D4D4FF47A71287882 -S31508008C80B1FBF0F00B490968B1FBF0F000F009FC04 -S31508008C9008B1012070BD102C07D200222146501EB3 -S31508008CA000F098F86C60002070BD012070BD0000CF -S31508008CB014000020100000202DE9F04186B042483B -S31508008CC0016841F080510160016801F0805100910E -S31508008CD0011D0A6842F480420A60096801F480416D -S31508008CE00091394910390A6842F002020A600A6896 -S31508008CF002F0020200920A6842F008020A60096855 -S31508008D0001F008010091016841F4802101600168C1 -S31508008D1001F480210091016841F00071016000684A -S31508008D2000F000700090032000F074F800226FF045 -S31508008D300B00114600F04EF800226FF00A001146AB -S31508008D4000F048F800226FF00900114600F042F8DA -S31508008D500022501F114600F03DF80022101F114650 -S31508008D6000F038F80022901E114600F033F8002271 -S31508008D70501E114600F02EF8802001900120029026 -S31508008D8000240394049401A9DFF840804046FFF7C5 -S31508008D905FFE4FF440770197022602960394032557 -S31508008DA004950720059001A90948FFF751FE019788 -S31508008DB00296039404950920059001A94046FFF7F9 -S31508008DC047FE06B0BDE8F081403802400004024084 -S31508008DD0000C0240F0B40D460D4B1B68C3F302238A -S31508008DE0C3F10704042C00D90424191D072901D24C -S31508008DF0002300E0DB1E012606FA04F1491E29407D -S31508008E0099409E40761E16403143F0BC00F03EBFA6 -S31508008E100CED00E000F00701054A10684FF6FF0365 -S31508008E20184040EA012003490843106070470000D3 -S31508008E300CED00E00000FA05F8B51948016841F0A4 -S31508008E4080510160006800F080500090154C206841 -S31508008E5040F480302060FFF7F3FE05464FF47A763B -S31508008E6006E0FFF7EDFE401BB04201D90320F8BD2E -S31508008E706068C003F5D5206840F400302060FFF72D -S31508008E80DFFE054606E0FFF7DBFE401BB04201D9D0 -S31508008E900320F8BD60688003F5D50020F8BD000002 -S31508008EA040380240007000402DE9F04704460D4660 -S31508008EB0002C17D0DFF83081D8F8000000F00F003A -S31508008EC0A84211D2D8F8000020F00F002843C8F8AD -S31508008ED00000D8F8000000F00F00A84204D00120D6 -S31508008EE0BDE8F0870120FBE72068404E810712D5D0 -S31508008EF0400703D5306840F4E0503060207800071A -S31508008F0003D5306840F4604030603068A16820F0CE -S31508008F10F000084330602078C0072ED033496068D7 -S31508008F200839012806D0022809D0096889070BD410 -S31508008F300120D5E70968890306D40120D0E7096826 -S31508008F40890101D40120CBE7316821F003010143EF -S31508008F503160FFF775FE074641F2883906E0FFF7EC -S31508008F606FFEC01B484501D90320B9E73068616820 -S31508008F7000F00C00B0EB810FF1D1D8F8000000F03A -S31508008F800F00A8420ED9D8F8000020F00F00284399 -S31508008F90C8F80000D8F8000000F00F00A84201D079 -S31508008FA001209DE72078400705D53068E16820F460 -S31508008FB0E050084330602078000706D530682169FC -S31508008FC020F4604040EAC100306000F03BF83168A8 -S31508008FD0074AC1F30311515CC840064908600020DE -S31508008FE0FFF748FE00207BE7003C024008380240B5 -S31508008FF0EC9C00081000002001480068704700003B -S315080090001000002000B5FFF7F7FF04490968044A75 -S31508009010C1F38221515CC84000BD000008380240F7 -S31508009020FC9C000800B5FFF7E7FF04490968044AF5 -S31508009030C1F34231515CC84000BD00000838024007 -S31508009040FC9C000810B51748006810F00C0116487B -S3150800905016D04310042912D0082911D1114C241F07 -S31508009060216801F03F02216849020AD52068C0F349 -S315080090708810A0FB03010023FFF71CF909E0184636 -S3150800908010BD21680023C1F38811A1FB0001FFF779 -S3150800909011F92168C1F30141491C4900B0FBF1F0FF -S315080090A010BD0000083802400024F4002DE9F84FEE -S315080090B004464FF00008002C15D02078DFF8BC9342 -S315080090C0A9F10407C007A7F1040560D0D9F8000084 -S315080090D0C0F3810001280CD0D9F80000C0F3810044 -S315080090E0022803D00CE00120BDE8F88F386840025A -S315080090F006D5286880034AD5606870BB0120F3E767 -S315080091006068B0F5803F11D0A8B1B0F5A02F1BD08C -S31508009110286820F480302860286820F48020286099 -S31508009120606830B3FFF78CFD06461EE0286840F4F9 -S3150800913080302860F4E7286820F4803028602868A2 -S3150800914020F480202860EBE7286840F48020286017 -S31508009150286840F480302860E2E718E0FFF770FDE1 -S31508009160801B642801D90320BEE728688003F5D54B -S315080091700DE0FFF765FD064606E0FFF761FD801B7B -S31508009180642801D90320AFE728688003F5D420783E -S3150800919080074BD5D9F8000010F00C0F08D0D9F885 -S315080091A00000C0F38100022812D1386840020FD4AB -S315080091B02868800704D5E068012801D0012093E7D4 -S315080091C02868216920F0F80040EAC10028602DE0EF -S315080091D0E068C8B1286840F001002860FFF730FD54 -S315080091E0064606E0FFF72CFD801B022801D903205E -S315080091F07AE728688007F5D52868216920F0F800FD -S3150800920040EAC100286011E0286820F001002860C3 -S31508009210FFF716FD064606E0FFF712FD801B02283B -S3150800922001D9032060E728688007F5D4207800076D -S3150800923030D5DFF848A260690AF16C0AA8B1DAF8F5 -S31508009240000040F00100CAF80000FFF7F9FC0646E6 -S3150800925006E0FFF7F5FC801B022801D9032043E747 -S31508009260DAF800008007F4D514E0DAF8000020F0F8 -S315080092700100CAF80000FFF7E3FC064606E0FFF720 -S31508009280DFFC801B022801D903202DE7DAF800004D -S315080092908007F4D42078400775D5DFF8E0A10AF1F5 -S315080092A0380ADAF80000C0000CD4DAF8000040F0FA -S315080092B08050CAF80000DAF8000000F080500090EC -S315080092C04FF00108DFF8B8B1DBF80000C00514D488 -S315080092D0DBF8000040F48070CBF80000FFF7B0FC24 -S315080092E0064606E0FFF7ACFC801B642801D903207C -S315080092F0FAE6DBF80000C005F4D5DFF880B1A0680F -S315080093000BF1680B012814D0D0B1052825D0DBF85D -S31508009310000020F00100CBF80000DBF8000020F088 -S315080093200400CBF80000A06870B3FFF789FC064676 -S315080093302BE0DBF8000040F00100CBF80000F2E774 -S31508009340DBF8000020F00100CBF80000DBF8000095 -S3150800935020F00400CBF80000E5E7DBF8000040F059 -S315080093600400CBF80000DBF8000040F00100CBF861 -S315080093700000D8E7FFF764FC811B41F28830814280 -S3150800938003D90320B0E61FE004E0DBF800008007FD -S31508009390F0D510E0FFF754FC064608E0FFF750FC4E -S315080093A0811B41F28830814201D903209CE6DBF813 -S315080093B000008007F2D4B8F1010F05D1DAF80000F1 -S315080093C020F08050CAF80000A069E8B3D9F8001068 -S315080093D0C1F3810102294FD0022807D0286820F05E -S315080093E080702860FFF72CFC044640E0286820F0CF -S315080093F080702860FFF724FC064606E0FFF720FC8D -S31508009400801B022801D903206EE628688001F5D45E -S31508009410D4E90701A26A4FF0FF330843616A03EBF8 -S315080094205202890141EA0241084394F82C1040EAA5 -S31508009430016040F000503860286840F0807028606D -S31508009440FFF7FEFB044607E014E0FFF7F9FB001BF5 -S31508009450022801D9032047E628688001F5D509E0E6 -S31508009460FFF7EEFB001B022801D903203CE628681B -S315080094708001F5D4002037E6012035E60838024099 -S315080094800070004004284FF0E02104D0086920F05D -S31508009490040008617047086940F0040008617047D5 -S315080094A0704710B5401EB0F1807F01D3012010BD72 -S315080094B04FF0E02460610F21601700F0E7FB002001 -S315080094C0A06107202061002010BD10B5FFF7E8FF56 -S315080094D010BD10B50446002C02D0606F10B107E02D -S315080094E0012010BD002084F87000204600F027F8FF -S315080094F0242060672068016821F001010160204688 -S3150800950000F0FAF9012818D0606A10B1204600F078 -S3150800951070F92068416821F49041416020688168AB -S3150800952021F02A0181602068016841F0010101608B -S315080095302046BDE8104000F0C0B9012010BD7047B4 -S315080095402DE9F84F04460E4615469946A06F202881 -S3150800955002D00220BDE8F88FFEB1F5B194F870008C -S3150800956001281CD0012084F870004FF00008C4F8C8 -S315080095707C802220A067FFF763FB8246A4F8585038 -S31508009580A4F85A50FF21A0684FF4805398420DD191 -S31508009590226932B1A4F85C100FE00120DAE7022054 -S315080095A0D8E740F2FF11A4F85C1006E07F2268B104 -S315080095B0B0F1805F12D0A4F85C80B4F85C70984271 -S315080095C001D1206998B13546002628E0256915B1EC -S315080095D0A4F85C20F1E7A4F85C10EEE7216919B15C -S315080095E03F21A4F85C10E8E7A4F85C20E5E700252D -S315080095F015E00022534620212046CDF8009000F0C1 -S315080096000DFB08B10320A5E79DB12068406A3840E4 -S3150800961005F8010BB4F85A00401EA4F85A00B4F82D -S315080096205A000028E5D12020A06784F87080002021 -S3150800963090E72068406A384026F8020BEAE710B53A -S3150800964000F01CFBFFF70AFB00F046F800F0BEF836 -S31508009650BDE81040AFF30080002202488021FFF7E2 -S31508009660E7BA00000004024070B500F0ADF8044601 -S315080096700C4D6868201AB0F5FA7F0AD328780A4B89 -S3150800968040B100202870002218468021FFF7D0FA42 -S315080096906C6070BD01202870012218468021FFF7F2 -S315080096A0C7FAF5E7080000200004024010B50023B9 -S315080096B0014604480122FFF743FF08B1002010BD08 -S315080096C0012010BD6400002010B5FFF7BFFABDE801 -S315080096D01040FFF7FABE000010B592B0302106A878 -S315080096E0FEF75FFE142101A8FEF75BFE1F4801681E -S315080096F041F080510160006800F0805000901C48DD -S31508009700016841F440410160006800F4404000905F -S31508009710012006904FF4A020079002240C946005BF -S315080097200D9008200E904FF4D8700F901094119455 -S3150800973006A8FFF7BBFC00B1FEE7FFF77DFB00B10B -S31508009740FEE70F2001900294002003904FF4A050EA -S3150800975004904FF480500590072101A8FFF7A4FB59 -S31508009760002800D0FEE712B010BD000040380240C5 -S31508009770007000401048016841F4700101600F480C -S31508009780016841F0010101600C4A002108321160AC -S3150800979002680B4B1A400260031D0A4A1A600268E7 -S315080097A022F48022026005480C30016058060249FE -S315080097B0803908607047000088ED00E000380240F4 -S315080097C0FFFFF6FE10300024FFF73ABA10B5FFF790 -S315080097D013FC4FF47A71B0FBF1F0FFF762FE042038 -S315080097E0FFF750FE0022BDE81040501E1146FFF755 -S315080097F0F1BA90F82410C90706D001684A68836A46 -S3150800980022F400321A434A6090F82410890706D5D4 -S3150800981001684A68C36A22F480321A434A6090F89B -S315080098202410490706D501684A68036B22F480228A -S315080098301A434A6090F82410090706D501684A6851 -S31508009840436B22F400421A434A6090F82410C90672 -S3150800985006D501688A68836B22F480521A438A60A7 -S3150800986090F82410890606D501688A68C36B22F425 -S3150800987000521A438A6090F82410490611D50168E7 -S315080098804A68036C22F480121A434A60016CB1F5E7 -S31508009890801F06D101684A68436C22F4C0021A4345 -S315080098A04A6090F82410090606D501684A68806C53 -S315080098B022F4002202434A60704738B50446002560 -S315080098C0E567FFF7BDF903462068006800070BD572 -S315080098D06FF07E400090002220464FF4001100F001 -S315080098E09DF908B1032038BD20206067A06784F879 -S315080098F07050002038BD000070B5044600200025D1 -S31508009900A2682169E3690A43616919430A43216820 -S315080099100B68B64E334013430B6021684A68E36808 -S3150800992022F440521A434A60A169226A0A4321680E -S315080099308B6823F4306313438B60AD4E4FF40042BB -S315080099402168AC4BB14213D1196811F0030107D055 -S31508009950012909D0022905D0032907D01021B4E02E -S315080099600121B2E00221B0E00421AEE00821ACE01A -S31508009970A14EB14213D1196811F00C0107D0042980 -S3150800998009D0082905D00C2907D010219DE000210F -S315080099909BE0022199E0042197E0082195E0974E83 -S315080099A0B14213D1196811F0300107D0102909D036 -S315080099B0202905D0302907D0102186E0002184E02F -S315080099C0022182E0042180E008217EE08C4EB1422B -S315080099D013D1196811F0C00107D0402909D0802990 -S315080099E005D0C02907D010216FE000216DE00221C3 -S315080099F06BE0042169E0082167E0824EB14216D186 -S31508009A00196811F440710AD0B1F5807F0BD0B1F511 -S31508009A10007F06D0B1F5407F07D0102155E0002120 -S31508009A2053E0022151E004214FE008214DE0764E33 -S31508009A30B14216D1196811F440610AD0B1F5806FA8 -S31508009A400BD0B1F5006F06D0B1F5406F07D01021E5 -S31508009A503BE0012139E0022137E0042135E0082105 -S31508009A6033E06A4EB14216D1196811F440510AD052 -S31508009A70B1F5805F0BD0B1F5005F06D0B1F5405F58 -S31508009A8007D0102121E000211FE002211DE004215A -S31508009A901BE0082119E05E4EB14215D1196811F490 -S31508009AA0404109D0B1F5804F0AD0914206D0B1F5B0 -S31508009AB0404F07D0102108E0002106E0022104E00B -S31508009AC0042102E0082100E01021E3694FF6EF7651 -S31508009AD0934247D1092935D2DFE801F0050F193439 -S31508009AE0213434342B00FFF78DFA4100606801EB0E -S31508009AF05001B1FBF0F080B225E0FFF793FA410080 -S31508009B00606801EB5001B1FBF0F080B21BE06068C1 -S31508009B10404901EB5001B1FBF0F080B213E0FFF7CA -S31508009B2091FA4100606801EB5001B1FBF0F080B298 -S31508009B3009E060684FF4803101EB5001B1FBF0F0A9 -S31508009B4080B200E00125A0F11001B14208D84FF615 -S31508009B50F0710140C0F3420001432068C16040E053 -S31508009B6001253EE0092933D2DFE801F0050F193255 -S31508009B70213232322B00FFF745FA0146606801EBC5 -S31508009B805001B1FBF0F080B223E0FFF74BFA014633 -S31508009B90606801EB5001B1FBF0F080B219E0606833 -S31508009BA01D4901EB5001B1FBF0F080B211E0FFF75F -S31508009BB049FA0146606801EB5001B1FBF0F080B24A -S31508009BC007E0606802EB5001B1FBF0F080B200E0FC -S31508009BD00125A0F11001B14202D82168C86000E051 -S31508009BE00125002020666066284670BDF369FFEFF0 -S31508009BF000100140903802400044004000480040F0 -S31508009C00004C00400050004000140140007800401D -S31508009C10007C00400048E8010024F4002DE9F041EA -S31508009C2004460E4617469846069D08E0681C06D068 -S31508009C30FFF706F8A0EB0800A8420BD855B1206834 -S31508009C40C06936EA000017D00020B842EED00020DE -S31508009C50BDE8F0812068016821F4D07101602068B0 -S31508009C60816821F00101816020206067A0670020DB -S31508009C7084F870000320EBE70120E6E70249014873 -S31508009C80086070470080000808ED00E00907090E23 -S31508009C90002804DB00F1E02080F80014704700F08B -S31508009CA00F0000F1E02080F8141D7047FFF7C7FC8D -S31508009CB0FEF75DFCFFF7D8FCFEF752FCFAE74FF01B -S31508009CC04070E1EE100A7047050206020603070314 -S31508009CD00803090309040A040B040C040C050D0502 -S31508009CE00E050F050F0610061007100800000000E5 -S31508009CF0000000000102030406070809000000002E -S31508009D0001020304249D0008000000202000000032 -S31508009D1008820008449D0008200000205007000023 -S31508009D202482000800000000000000000000000077 -S31508009D30000000000024F4000100000010000000EC -S30908009D400000000011 +S315080087E0F5B305682D59ED08556005682C5904F050 +S315080087F00204D46005684FF4DA7404EB01142D59A9 +S3150800880005F00F05156105682D59C5F3072595610E +S3150800881005682C59240C546104684FF4DC7202EB89 +S315080088200112A4581C700468A458240A5C700468D1 +S31508008830A458240C9C700468A258120EDA700468B6 +S315080088404FF4DE7202EB0112A4581C710468A45896 +S31508008850240A5C710468A458240C9C71046800E01E +S3150800886016E0A258120EDA71B9B10068016941F032 +S3150800887020010161002030BD416A41F400114162C6 +S31508008880012030BD416A41F400114162012030BD2A +S3150800889005682D596D0D1560A7E70068C16841F098 +S315080088A02001C160E6E770B50446002C03D094F8B1 +S315080088B0200010B104E0012070BD204600F09CF8AD +S315080088C02068016821F00201016000F0B3F905464D +S315080088D005260CE000F0AEF9401B0A2807D9606AA5 +S315080088E040F40030606284F82060012070BD206882 +S315080088F040688007EED42068016841F001010160F4 +S3150800890000F098F905460CE000F094F9401B0A2897 +S3150800891007D9606A40F40030606284F8206001205C +S3150800892070BD20684068C007EED0207E01283FD081 +S315080089302068016821F080010160607E01283DD031 +S315080089402068016821F040010160A07E01283BD023 +S315080089502068016821F020010160E07E012839D0F5 +S315080089602068016841F010010160207F012837D096 +S315080089702068016821F008010160607F012835D070 +S315080089802068016821F004010160D4E90201084366 +S31508008990D4E90412114308436168491E0843216853 +S315080089A0C86100206062012084F82000002070BDA4 +S315080089B02068016841F080010160BEE7206801680F +S315080089C041F040010160C0E72068016841F02001DC +S315080089D00160C2E72068016821F010010160C4E760 +S315080089E02068016841F008010160C6E7206801684F +S315080089F041F004010160C8E7704770B5044694F871 +S31508008A002000012805D0606A40F400206062012039 +S31508008A1070BD022084F820002068016821F0010159 +S31508008A20016000F007F905460DE000F003F9401B68 +S31508008A300A2808D9606A40F400306062052084F884 +S31508008A402000012070BD20684068C007EDD1606233 +S31508008A5070BD00002DE9F84F0022DFF894A14FF011 +S31508008A6003084FF00F090AF1040B012595400B681E +S31508008A702B40AB4272D14C68012C05D0022C03D096 +S31508008A80112C01D0122C10D18668540008FA04F76C +S31508008A90BE43CF68A740374387604668AE430C7924 +S31508008AA0C4F30014944034434460C468570008FA79 +S31508008AB007F5AC438E68BE402643C6604C68022C58 +S31508008AC001D0122C12D1D40800EB840CDCF82060FB +S31508008AD05407E40E09FA04FE26EA0E06D1F810E059 +S31508008AE00EFA04FE4EEA060ECCF820E00468AC4303 +S31508008AF00D7905F00305BD40254305604C68E40083 +S31508008B006FD53C4C256845F480452560246804F4F7 +S31508008B1080440094384C22F003052E19D6F80878BC +S31508008B209407250F09FA05F4A743344CA04201D14E +S31508008B3000242EE0324CA04201D1012429E0314C18 +S31508008B40A04201D1022424E02F4CA04201D10324E3 +S31508008B501FE02E4CA04202D104241AE041E02C4C1E +S31508008B60A04201D1052414E02A4CA04201D10624D2 +S31508008B700FE0294CA04201D107240AE0274CA04265 +S31508008B8001D1082405E0264CA04201D1092400E0C1 +S31508008B900A24AC403C43C6F80848DAF800409C432F +S31508008BA04D68ED0300D51C43CAF80040DBF80040C9 +S31508008BB09C434D68AD0300D51C43CBF800400C4DD3 +S31508008BC008352C689C434E68F60200D51C432C6079 +S31508008BD0074D0C352C689C434E68B60200D51C43DD +S31508008BE02C60521C102AFFF440AFBDE8F88F000035 +S31508008BF0003C014044380240003001400000024079 +S31508008C000004024000080240000C02400010024026 +S31508008C100014024000180240001C024000200240D6 +S31508008C2000240240002A01D081617047090481614D +S31508008C307047000001488068704700001400002053 +S31508008C400248816802781144816070471400002048 +S31508008C5010B5032000F0D8F8002000F005F800F061 +S31508008C6025F8002010BD000070B504460D4D4FF4E0 +S31508008C707A712878B1FBF0F00B490968B1FBF0F07E +S31508008C8000F031FC08B1012070BD102C07D200227B +S31508008C902146501E00F098F86C60002070BD012037 +S31508008CA070BD000014000020100000202DE9F041DE +S31508008CB086B04248016841F080510160016801F0C0 +S31508008CC080510091011D0A6842F480420A600968D1 +S31508008CD001F480410091394910390A6842F00202CC +S31508008CE00A600A6802F0020200920A6842F0080264 +S31508008CF00A60096801F008010091016841F48021C1 +S31508008D000160016801F480210091016841F0007159 +S31508008D100160006800F000700090032000F074F80D +S31508008D2000226FF00B00114600F04EF800226FF09B +S31508008D300A00114600F048F800226FF009001146B3 +S31508008D4000F042F80022501F114600F03DF80022BC +S31508008D50101F114600F038F80022901E114600F048 +S31508008D6033F80022501E114600F02EF8802001909C +S31508008D700120029000240394049401A9DFF840809E +S31508008D804046FFF767FE4FF44077019702260296A2 +S31508008D900394032504950720059001A90948FFF7C0 +S31508008DA059FE01970296039404950920059001A996 +S31508008DB04046FFF74FFE06B0BDE8F0814038024056 +S31508008DC000040240000C0240F0B40D460D4B1B682F +S31508008DD0C3F30223C3F10704042C00D90424191D84 +S31508008DE0072901D2002300E0DB1E012606FA04F15A +S31508008DF0491E294099409E40761E16403143F0BCD4 +S31508008E0000F06EBF0CED00E000F00701054A10689F +S31508008E104FF6FF03184040EA012003490843106053 +S31508008E20704700000CED00E00000FA05F8B5194897 +S31508008E30016841F080510160006800F080500090A0 +S31508008E40154C206840F480302060FFF7F3FE054695 +S31508008E504FF47A7606E0FFF7EDFE401BB04201D9E3 +S31508008E600320F8BD6068C003F5D5206840F40030DB +S31508008E702060FFF7DFFE054606E0FFF7DBFE401B36 +S31508008E80B04201D90320F8BD60688003F5D50020FB +S31508008E90F8BD000040380240007000402DE9F04758 +S31508008EA004460D46002C17D0DFF83481D8F80000A8 +S31508008EB000F00F00A84211D2D8F8000020F00F00E9 +S31508008EC02843C8F80000D8F8000000F00F00A842B0 +S31508008ED004D00120BDE8F0870120FBE72068414E59 +S31508008EE0810712D5400703D5306840F4E05030605A +S31508008EF02078000703D5306840F460403060306859 +S31508008F00A16820F0F000084330602078C0072ED012 +S31508008F10344960680839012806D0022809D009684A +S31508008F2089070BD40120D5E70968890306D40120EF +S31508008F30D0E70968890101D40120CBE7316821F01F +S31508008F40030101433160FFF775FE074641F2883990 +S31508008F5006E0FFF76FFEC01B484501D90320B9E7B5 +S31508008F603068616800F00C00B0EB810FF1D1D8F8D9 +S31508008F70000000F00F00A8420ED9D8F8000020F033 +S31508008F800F002843C8F80000D8F8000000F00F00CA +S31508008F90A84201D001209DE72078400705D5306812 +S31508008FA0E16820F4E050084330602078000706D5D1 +S31508008FB03068216920F4604040EAC100306000F062 +S31508008FC03FF83168084AC1F30311515CC8400749A4 +S31508008FD0086007480068FFF747FE00207AE70000A8 +S31508008FE0003C024008380240409D0008100000205E +S31508008FF01800002001480068704700001000002093 +S3150800900000B5FFF7F7FF04490968044AC1F382214E +S31508009010515CC84000BD000008380240509D000859 +S3150800902000B5FFF7E7FF04490968044AC1F342316E +S31508009030515CC84000BD000008380240509D000839 +S3150800904010B51748006810F00C01164816D04310E2 +S31508009050042912D0082911D1114C241F216801F0C6 +S315080090603F02216849020AD52068C0F38810A0FB90 +S3150800907003010023FFF71EF909E0184610BD216811 +S315080090800023C1F38811A1FB0001FFF713F921683A +S31508009090C1F30141491C4900B0FBF1F010BD0000C5 +S315080090A0083802400024F4002DE9F84F04464FF032 +S315080090B00008002C15D02078DFF80494A9F10407DD +S315080090C0C007A7F1040560D0D9F80000C0F38100F5 +S315080090D001280CD0D9F80000C0F38100022803D07B +S315080090E00CE00120BDE8F88F3868400206D52868EC +S315080090F080034AD5606870BB0120F3E76068B0F565 +S31508009100803F11D0A8B1B0F5A02F1BD0286820F455 +S3150800911080302860286820F480202860606830B392 +S31508009120FFF788FD06461EE0286840F48030286070 +S31508009130F4E7286820F480302860286820F4802026 +S315080091402860EBE7286840F480202860286840F407 +S3150800915080302860E2E718E0FFF76CFD801B642882 +S3150800916001D90320BEE728688003F5D50DE0FFF78F +S3150800917061FD064606E0FFF75DFD801B642801D900 +S315080091800320AFE728688003F5D4207880074BD5FD +S31508009190D9F8000010F00C0F08D0D9F80000C0F379 +S315080091A08100022812D1386840020FD42868800747 +S315080091B004D5E068012801D0012093E728682169D1 +S315080091C020F0F80040EAC10028602DE0E068C8B148 +S315080091D0286840F001002860FFF72CFD064606E0E7 +S315080091E0FFF728FD801B022801D903207AE72868A3 +S315080091F08007F5D52868216920F0F80040EAC10003 +S31508009200286011E0286820F001002860FFF712FDA9 +S31508009210064606E0FFF70EFD801B022801D903204B +S3150800922060E728688007F5D42078000730D5DFF88E +S3150800923090A260690AF16C0AA8B1DAF8000040F059 +S315080092400100CAF80000FFF7F5FC064606E0FFF73E +S31508009250F1FC801B022801D9032043E7DAF8000055 +S315080092608007F4D514E0DAF8000020F00100CAF807 +S315080092700000FFF7DFFC064606E0FFF7DBFC801B75 +S31508009280022801D903202DE7DAF800008007F4D474 +S315080092902078400775D5DFF828A20AF1380ADAF8E7 +S315080092A00000C0000CD4DAF8000040F08050CAF87C +S315080092B00000DAF8000000F0805000904FF0010836 +S315080092C0DFF800B2DBF80000C00514D4DBF80000B4 +S315080092D040F48070CBF80000FFF7ACFC064606E0C9 +S315080092E0FFF7A8FC801B642801D90320FAE6DBF8FF +S315080092F00000C005F4D5DFF8C8B1A0680BF1680B0B +S31508009300012814D0D0B1052825D0DBF8000020F0BC +S315080093100100CBF80000DBF8000020F00400CBF8D1 +S315080093200000A06870B3FFF785FC06462BE0DBF863 +S31508009330000040F00100CBF80000F2E7DBF800007F +S3150800934020F00100CBF80000DBF8000020F0040054 +S31508009350CBF80000E5E7DBF8000040F00400CBF8A6 +S315080093600000DBF8000040F00100CBF80000D8E769 +S31508009370FFF760FC811B41F28830814203D9032044 +S31508009380B0E61FE004E0DBF800008007F0D510E047 +S31508009390FFF750FC064608E0FFF74CFC811B41F23C +S315080093A08830814201D903209CE6DBF8000080075B +S315080093B0F2D4B8F1010F05D1DAF8000020F0805098 +S315080093C0CAF80000A169E9B3D9F800004FF0FF38E0 +S315080093D0C0F3810002284CD0022907D0286820F063 +S315080093E080702860FFF726FC04463EE0286820F0D7 +S315080093F080702860FFF71EFC064606E0FFF71AFC99 +S31508009400801B022801D903206CE628688001F5D460 +S31508009410D4E90701A26A0843616A08EB5202890186 +S3150800942041EA0241084394F82C1040EA016040F0F2 +S3150800943000503860286840F080702860FFF7FAFB13 +S31508009440044607E03AE0FFF7F5FB001B022801D9BE +S31508009450032047E628688001F5D52FE0FFF7EAFBE9 +S31508009460001B022801D903203CE628688001F5D4B0 +S3150800947024E0386801291FD0E26900F4800191428E +S315080094801AD1226A00F03F01914215D1626A47F665 +S31508009490C0710140B1EB821F0ED1A26A00F44031BF +S315080094A008EB5202B1EB024F06D194F82C1000F0EB +S315080094B07060B0EB016F01D0012013E6002011E6C1 +S315080094C0083802400070004004284FF0E02104D01C +S315080094D0086920F0040008617047086940F0040034 +S315080094E008617047704710B5401EB0F1807F01D300 +S315080094F0012010BD4FF0E02460610F21601700F0D5 +S31508009500EFFB0020A06107202061002010BD10B5E8 +S31508009510FFF7E8FF10BD10B50446002C02D0606FB7 +S3150800952010B107E0012010BD002084F87000204625 +S3150800953000F027F8242060672068016821F00101FF +S315080095400160204600F0DEF9012818D0606A10B1E3 +S31508009550204600F054F92068416821F490414160A2 +S315080095602068816821F02A0181602068016841F03D +S31508009570010101602046BDE8104000F0A4B90120B1 +S3150800958010BD70472DE9F84F04460E461546984615 +S31508009590A06F202802D00220BDE8F88FFEB1F5B1F1 +S315080095A094F8700001281CD0012084F870004FF050 +S315080095B0000AC4F87CA02220A067FFF73BFB81467F +S315080095C0A4F85850A4F85A50FF21A0684FF48053C5 +S315080095D098420DD1226932B1A4F85C100FE001203F +S315080095E0DAE70220D8E740F2FF11A4F85C1006E09B +S315080095F07F2278B1B0F1805F14D0A4F85CA0B4F8EB +S315080096005C70984201D12069A8B13546002684F8D5 +S3150800961070A028E0256915B1A4F85C20EFE7A4F846 +S315080096205C10ECE7216919B13F21A4F85C10E6E764 +S31508009630A4F85C20E3E70025E9E700224B46202151 +S315080096402046CDF8008000F0EFFA08B10320A3E722 +S315080096508DB12068406A384005F8010BB4F85A0005 +S31508009660401EA4F85A00B4F85A000028E5D1202074 +S31508009670A067002090E72068406A384026F8020B69 +S31508009680ECE710B500F024FBFFF7E2FA00F046F825 +S3150800969000F0A2F8BDE81040AFF3008000220248AF +S315080096A08021FFF7BFBA00000004024070B500F041 +S315080096B091F804460C4D6868201AB0F5FA7F0AD36B +S315080096C028780A4B40B100202870002218468021CD +S315080096D0FFF7A8FA6C6070BD0120287001221846B1 +S315080096E08021FFF79FFAF5E70800002000040240F2 +S315080096F010B50023014604480122FFF743FF08B1CD +S31508009700002010BD012010BD6400002010B5FFF731 +S3150800971097FABDE81040FFF7FABE000010B592B000 +S31508009720302106A8FEF73DFE142101A8FEF739FEF2 +S315080097301F48016841F080510160006800F08050C0 +S3150800974000901C48016841F440410160006800F43B +S3150800975040400090012006904FF4A0200790022474 +S315080097600C9460050D9008200E904FF4D8700F9059 +S315080097701094119406A8FFF797FC00B1FEE7FFF7CF +S3150800978055FB00B1FEE70F200190029400200390DC +S315080097904FF4A05004904FF480500590072101A87B +S315080097A0FFF77CFB002800D0FEE712B010BD0000D2 +S315080097B040380240007000400548016841F47001D5 +S315080097C0016003494FF00060803908607047000067 +S315080097D088ED00E0FFF72EBA10B5FFF70BFC4FF443 +S315080097E07A71B0FBF1F0FFF77EFE0420FFF76CFEFE +S315080097F00022BDE81040501E1146FFF7E5BA90F862 +S315080098002410C90706D001684A68836A22F4003220 +S315080098101A434A6090F82410890706D501684A68F1 +S31508009820C36A22F480321A434A6090F82410490722 +S3150800983006D501684A68036B22F480221A434A60F7 +S3150800984090F82410090706D501684A68436B22F484 +S3150800985000421A434A6090F82410C90606D50168E2 +S315080098608A68836B22F480521A438A6090F824101F +S31508009870890606D501688A68C36B22F400521A4322 +S315080098808A6090F82410490611D501684A68036C65 +S3150800989022F480121A434A60016CB1F5801F06D182 +S315080098A001684A68436C22F4C0021A434A6090F879 +S315080098B02410090606D501684A68806C22F400223D +S315080098C002434A60704738B504460025E567FFF746 +S315080098D0B1F903462068006800070BD56FF07E4093 +S315080098E00090002220464FF4001100F09DF908B1BF +S315080098F0032038BD20206067A06784F870500020D8 +S3150800990038BD000070B5044600200025A26821690C +S31508009910E3690A43616919430A4321680B68B64E2D +S31508009920334013430B6021684A68E36822F44052C7 +S315080099301A434A60A169226A0A4321688B6823F49C +S31508009940306313438B60AD4E4FF400422168AC4B35 +S31508009950B14213D1196811F0030107D0012909D0C2 +S31508009960022905D0032907D01021B4E00121B2E06D +S315080099700221B0E00421AEE00821ACE0A14EB142DC +S3150800998013D1196811F00C0107D0042909D0082948 +S3150800999005D00C2907D010219DE000219BE002216B +S315080099A099E0042197E0082195E0974EB14213D13A +S315080099B0196811F0300107D0102909D0202905D0DF +S315080099C0302907D0102186E0002184E0022182E0B8 +S315080099D0042180E008217EE08C4EB14213D119683B +S315080099E011F0C00107D0402909D0802905D0C02927 +S315080099F007D010216FE000216DE002216BE0042101 +S31508009A0069E0082167E0824EB14216D1196811F45F +S31508009A1040710AD0B1F5807F0BD0B1F5007F06D032 +S31508009A20B1F5407F07D0102155E0002153E002210F +S31508009A3051E004214FE008214DE0764EB14216D19F +S31508009A40196811F440610AD0B1F5806F0BD0B1F5F1 +S31508009A50006F06D0B1F5406F07D010213BE0012119 +S31508009A6039E0022137E0042135E0082133E06A4E67 +S31508009A70B14216D1196811F440510AD0B1F5805F88 +S31508009A800BD0B1F5005F06D0B1F5405F07D01021C5 +S31508009A9021E000211FE002211DE004211BE008212E +S31508009AA019E05E4EB14215D1196811F4404109D04A +S31508009AB0B1F5804F0AD0914206D0B1F5404F07D094 +S31508009AC0102108E0002106E0022104E0042102E05A +S31508009AD0082100E01021E3694FF6EF76934247D15B +S31508009AE0092935D2DFE801F0050F19342134343459 +S31508009AF02B00FFF785FA4100606801EB5001B1FBC6 +S31508009B00F0F080B225E0FFF78BFA4100606801EBC0 +S31508009B105001B1FBF0F080B21BE06068404901EBF0 +S31508009B205001B1FBF0F080B213E0FFF789FA41006B +S31508009B30606801EB5001B1FBF0F080B209E06068A3 +S31508009B404FF4803101EB5001B1FBF0F080B200E038 +S31508009B500125A0F11001B14208D84FF6F071014075 +S31508009B60C0F3420001432068C16040E001253EE0A1 +S31508009B70092933D2DFE801F0050F193221323232D2 +S31508009B802B00FFF73DFA0146606801EB5001B1FB77 +S31508009B90F0F080B223E0FFF743FA0146606801EB74 +S31508009BA05001B1FBF0F080B219E060681D4901EB85 +S31508009BB05001B1FBF0F080B211E0FFF741FA01461F +S31508009BC0606801EB5001B1FBF0F080B207E0606815 +S31508009BD002EB5001B1FBF0F080B200E00125A0F1E4 +S31508009BE01001B14202D82168C86000E001250020B2 +S31508009BF020666066284670BDF369FFEF00100140D5 +S31508009C00903802400044004000480040004C0040A4 +S31508009C10005000400014014000780040007C0040DD +S31508009C200048E8010024F4002DE9F04704460E46F2 +S31508009C3017469846089D4FF0000A4FF020093BE06A +S31508009C40681C39D0FEF7F6FFA0EB0800A84221D819 +S31508009C5005B32068016849072ED5C069C0430005C9 +S31508009C602AD421684FF4006008622068016821F44C +S31508009C70D07101602068816821F001018160C4F813 +S31508009C807490C4F87890C4F87C9084F870A0032087 +S31508009C90BDE8F0872068016821F4D071016020686A +S31508009CA0816821F001018160C4F87490C4F8789045 +S31508009CB084F870A00320EBE72068C06936EA000044 +S31508009CC004D00020B842BBD00020E1E70120F9E724 +S31508009CD002490148086070470080000808ED00E066 +S31508009CE00907090E002804DB00F1E02080F80014BB +S31508009CF0704700F00F0000F1E02080F8141D70474F +S31508009D00FFF7BFFCFEF733FCFFF7D0FCFEF728FC95 +S31508009D10FAE74FF04070E1EE100A704705020602B6 +S31508009D20060307030803090309040A040B040C04C1 +S31508009D300C050D050E050F050F0610061007100871 +S31508009D4000000000000000000102030406070809DD +S31508009D500000000001020304789D000800000020AE +S31508009D602000000008820008989D000820000020B6 +S31508009D7050070000248200080000000000000000D0 +S31508009D8000000000000000000024F40001000000AC +S30D08009D901000000000000000AD S705080081CDA4 diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h index 5de6c6e1..2c47d3f0 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h @@ -12,29 +12,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h index 4209206e..473ff95e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h @@ -125,8 +125,6 @@ typedef struct This parameter can be a value of @ref UART_MSB_First. */ } UART_AdvFeatureInitTypeDef; - - /** * @brief HAL UART State definition * @note HAL UART State value is a combination of 2 different substates: gState and RxState (see @ref UART_State_Definition). @@ -206,10 +204,9 @@ typedef struct __UART_HandleTypeDef uint16_t Mask; /*!< UART Rx RDR register mask */ + void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ + void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ @@ -313,8 +310,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define HAL_UART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_UART_ERROR_RTO ((uint32_t)0x00000020U) /*!< Receiver Timeout error */ + #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000020U) /*!< Invalid Callback error */ +#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000040U) /*!< Invalid Callback error */ #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ /** * @} @@ -400,11 +399,11 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @} */ -/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut +/** @defgroup UART_Receiver_Timeout UART Receiver Timeout * @{ */ -#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART receiver timeout disable */ -#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART receiver timeout enable */ +#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART Receiver Timeout disable */ +#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART Receiver Timeout enable */ /** * @} */ @@ -562,6 +561,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_Stop_Mode_Enable UART Advanced Feature Stop Mode Enable + * @{ + */ +#define UART_ADVFEATURE_STOPMODE_DISABLE 0x00000000U /*!< UART stop mode disable */ +#define UART_ADVFEATURE_STOPMODE_ENABLE USART_CR1_UESM /*!< UART stop mode enable */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_Mute_Mode UART Advanced Feature Mute Mode Enable * @{ @@ -579,6 +589,18 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_WakeUp_from_Stop_Selection UART WakeUp From Stop Selection + * @{ + */ +#define UART_WAKEUP_ON_ADDRESS 0x00000000U /*!< UART wake-up on address */ +#define UART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< UART wake-up on start bit */ +#define UART_WAKEUP_ON_READDATA_NONEMPTY USART_CR3_WUS /*!< UART wake-up on receive data register not empty or RXFIFO is not empty */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_DriverEnable_Polarity UART DriverEnable Polarity * @{ @@ -626,13 +648,20 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * - 0xXXXX : Flag mask in the ISR register * @{ */ +#if defined(USART_ISR_REACK) +#define UART_FLAG_REACK USART_ISR_REACK /*!< UART receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #define UART_FLAG_TEACK USART_ISR_TEACK /*!< UART transmit enable acknowledge flag */ +#if defined(USART_CR1_UESM) +#define UART_FLAG_WUF USART_ISR_WUF /*!< UART wake-up from stop mode flag */ +#endif /* USART_CR1_UESM */ #define UART_FLAG_RWU USART_ISR_RWU /*!< UART receiver wake-up from mute mode flag */ #define UART_FLAG_SBKF USART_ISR_SBKF /*!< UART send break flag */ #define UART_FLAG_CMF USART_ISR_CMF /*!< UART character match flag */ #define UART_FLAG_BUSY USART_ISR_BUSY /*!< UART busy flag */ #define UART_FLAG_ABRF USART_ISR_ABRF /*!< UART auto Baud rate flag */ #define UART_FLAG_ABRE USART_ISR_ABRE /*!< UART auto Baud rate error */ +#define UART_FLAG_RTOF USART_ISR_RTOF /*!< UART receiver timeout flag */ #define UART_FLAG_CTS USART_ISR_CTS /*!< UART clear to send flag */ #define UART_FLAG_CTSIF USART_ISR_CTSIF /*!< UART clear to send interrupt flag */ #define UART_FLAG_LBDF USART_ISR_LBDF /*!< UART LIN break detection flag */ @@ -674,6 +703,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define UART_IT_LBD 0x0846U /*!< UART LIN break detection interruption */ #define UART_IT_CTS 0x096AU /*!< UART CTS interruption */ #define UART_IT_CM 0x112EU /*!< UART character match interruption */ +#if defined(USART_CR1_UESM) +#define UART_IT_WUF 0x1476U /*!< UART wake-up from stop mode interruption */ +#endif /* USART_CR1_UESM */ +#define UART_IT_RTO 0x0B3AU /*!< UART receiver timeout interruption */ #define UART_IT_ERR 0x0060U /*!< UART error interruption */ @@ -689,13 +722,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define UART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ #define UART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ +#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ #define UART_CLEAR_OREF USART_ICR_ORECF /*!< Overrun Error Clear Flag */ #define UART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ #define UART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ #define UART_CLEAR_LBDF USART_ICR_LBDCF /*!< LIN Break Detection Clear Flag */ #define UART_CLEAR_CTSF USART_ICR_CTSCF /*!< CTS Interrupt Clear Flag */ #define UART_CLEAR_CMF USART_ICR_CMCF /*!< Character Match Clear Flag */ +#if defined(USART_CR1_UESM) +#define UART_CLEAR_WUF USART_ICR_WUCF /*!< Wake Up from stop mode Clear Flag */ +#endif /* USART_CR1_UESM */ +#define UART_CLEAR_RTOF USART_ICR_RTOCF /*!< UART receiver timeout clear flag */ /** * @} */ @@ -734,9 +771,9 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) \ do{ \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ - } while(0U) + SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ + SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ + } while(0U) /** @brief Clear the specified UART pending flag. * @param __HANDLE__ specifies the UART Handle. @@ -748,9 +785,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver Timeout clear flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag +#if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) @@ -790,7 +831,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __FLAG__ specifies the flag to check. * This parameter can be one of the following values: +#if defined(USART_ISR_REACK) + * @arg @ref UART_FLAG_REACK Receive enable acknowledge flag +#endif * @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_FLAG_WUF Wake up from stop mode flag + #endif * @arg @ref UART_FLAG_RWU Receiver wake up flag (if the UART in mute mode) * @arg @ref UART_FLAG_SBKF Send Break flag * @arg @ref UART_FLAG_CMF Character match flag @@ -802,6 +849,7 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_FLAG_TXE Transmit data register empty flag * @arg @ref UART_FLAG_TC Transmission Complete flag * @arg @ref UART_FLAG_RXNE Receive data register not empty flag + * @arg @ref UART_FLAG_RTOF Receiver Timeout flag * @arg @ref UART_FLAG_IDLE Idle Line detection flag * @arg @ref UART_FLAG_ORE Overrun Error flag * @arg @ref UART_FLAG_NE Noise Error flag @@ -815,12 +863,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to enable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (frame error, noise error, overrun error) @@ -835,12 +887,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to disable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) @@ -854,37 +910,46 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ -#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) +#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\ + & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) /** @brief Check whether the specified UART interrupt source is enabled or not. * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ #define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U) ? (__HANDLE__)->Instance->CR1 : \ - (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ - (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) + (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ + (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) /** @brief Clear the specified UART ISR flag, in setting the proper ICR register flag. * @param __HANDLE__ specifies the UART Handle. @@ -896,10 +961,14 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_NEF Noise detected Clear Flag * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver timeout clear flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) @@ -1083,10 +1152,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid) */ #define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__)\ - (((__CONTROL__) == UART_HWCONTROL_NONE) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS) || \ - ((__CONTROL__) == UART_HWCONTROL_CTS) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) + (((__CONTROL__) == UART_HWCONTROL_NONE) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS) || \ + ((__CONTROL__) == UART_HWCONTROL_CTS) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) /** * @brief Ensure that UART communication mode is valid. @@ -1134,8 +1203,15 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __TIMEOUT__ UART receiver timeout setting. * @retval SET (__TIMEOUT__ is valid) or RESET (__TIMEOUT__ is invalid) */ -#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ - ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) +#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ + ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) + +/** @brief Check the receiver timeout value. + * @note The maximum UART receiver timeout value is 0xFFFFFF. + * @param __TIMEOUTVALUE__ receiver timeout value. + * @retval Test result (TRUE or FALSE) + */ +#define IS_UART_RECEIVER_TIMEOUT_VALUE(__TIMEOUTVALUE__) ((__TIMEOUTVALUE__) <= 0xFFFFFFU) /** * @brief Ensure that UART LIN state is valid. @@ -1275,6 +1351,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define IS_UART_ADVFEATURE_MSBFIRST(__MSBFIRST__) (((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_DISABLE) || \ ((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_ENABLE)) +#if defined(USART_CR1_UESM) +/** + * @brief Ensure that UART stop mode state is valid. + * @param __STOPMODE__ UART stop mode state. + * @retval SET (__STOPMODE__ is valid) or RESET (__STOPMODE__ is invalid) + */ +#define IS_UART_ADVFEATURE_STOPMODE(__STOPMODE__) (((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_DISABLE) || \ + ((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_ENABLE)) + +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART mute mode state is valid. * @param __MUTE__ UART mute mode state. @@ -1282,6 +1368,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define IS_UART_MUTE_MODE(__MUTE__) (((__MUTE__) == UART_ADVFEATURE_MUTEMODE_DISABLE) || \ ((__MUTE__) == UART_ADVFEATURE_MUTEMODE_ENABLE)) +#if defined(USART_CR1_UESM) + +/** + * @brief Ensure that UART wake-up selection is valid. + * @param __WAKE__ UART wake-up selection. + * @retval SET (__WAKE__ is valid) or RESET (__WAKE__ is invalid) + */ +#define IS_UART_WAKEUP_SELECTION(__WAKE__) (((__WAKE__) == UART_WAKEUP_ON_ADDRESS) || \ + ((__WAKE__) == UART_WAKEUP_ON_STARTBIT) || \ + ((__WAKE__) == UART_WAKEUP_ON_READDATA_NONEMPTY)) +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART driver enable polarity is valid. @@ -1320,7 +1417,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -1369,6 +1467,10 @@ void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); */ /* Peripheral Control functions ************************************************/ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue); +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart); + HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart); @@ -1405,7 +1507,8 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart); HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart); -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); void UART_AdvFeatureConfig(UART_HandleTypeDef *huart); /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h index a5907f57..866a490f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h @@ -41,7 +41,24 @@ extern "C" { * @{ */ +#if defined(USART_CR1_UESM) +/** + * @brief UART wake up from stop mode parameters + */ +typedef struct +{ + uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF). + This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection. + If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must + be filled up. */ + uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long. + This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */ + + uint8_t Address; /*!< UART/USART node address (7-bit long max). */ +} UART_WakeUpTypeDef; + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -54,9 +71,9 @@ extern "C" { /** @defgroup UARTEx_Word_Length UARTEx Word Length * @{ */ -#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ -#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ -#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ +#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ +#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ +#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ /** * @} */ @@ -64,13 +81,12 @@ extern "C" { /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length * @{ */ -#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ -#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ +#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ +#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ /** * @} */ - /** * @} */ @@ -86,7 +102,8 @@ extern "C" { */ /* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime); +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime); /** * @} @@ -96,6 +113,10 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @{ */ +#if defined(USART_CR1_UESM) +void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart); + +#endif /* USART_CR1_UESM */ /** * @} @@ -106,8 +127,20 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, */ /* Peripheral Control functions **********************************************/ +#if defined(USART_CR1_UESM) +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart); + +#endif/* USART_CR1_UESM */ +#if defined(USART_CR3_UCESM) +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart); + +#endif /* USART_CR3_UCESM */ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength); + /** * @} */ @@ -126,12 +159,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua * @param __CLOCKSOURCE__ output variable. * @retval UART clocking source, written in __CLOCKSOURCE__. */ -#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ +#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ do { \ if((__HANDLE__)->Instance == USART1) \ { \ - switch(__HAL_RCC_GET_USART1_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART1_SOURCE()) \ + { \ case RCC_USART1CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -147,12 +180,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART2) \ { \ - switch(__HAL_RCC_GET_USART2_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART2_SOURCE()) \ + { \ case RCC_USART2CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -168,12 +201,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART3) \ { \ - switch(__HAL_RCC_GET_USART3_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART3_SOURCE()) \ + { \ case RCC_USART3CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -189,12 +222,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == UART4) \ { \ - switch(__HAL_RCC_GET_UART4_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART4_SOURCE()) \ + { \ case RCC_UART4CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -210,12 +243,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART5) \ { \ - switch(__HAL_RCC_GET_UART5_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART5_SOURCE()) \ + { \ case RCC_UART5CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -231,12 +264,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART6) \ { \ - switch(__HAL_RCC_GET_USART6_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART6_SOURCE()) \ + { \ case RCC_USART6CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -252,12 +285,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART7) \ { \ - switch(__HAL_RCC_GET_UART7_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART7_SOURCE()) \ + { \ case RCC_UART7CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -273,12 +306,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART8) \ { \ - switch(__HAL_RCC_GET_UART8_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART8_SOURCE()) \ + { \ case RCC_UART8CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -294,7 +327,7 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else \ { \ @@ -313,44 +346,44 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua */ #define UART_MASK_COMPUTATION(__HANDLE__) \ do { \ - if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x01FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x003FU ; \ - } \ - } \ - else \ - { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ -} while(0U) + } \ + } \ + else \ + { \ + (__HANDLE__)->Mask = 0x0000U; \ + } \ + } while(0U) /** * @brief Ensure that UART frame length is valid. @@ -369,7 +402,6 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \ ((__ADDRESS__) == UART_ADDRESS_DETECT_7B)) - /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c index 76efbf84..25a901fe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c @@ -326,7 +326,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -346,7 +345,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -393,7 +391,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -416,7 +413,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -481,7 +477,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -507,7 +502,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe /* Set the USART LIN Break detection length. */ MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -567,7 +561,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -596,7 +589,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add /* Set the wake up method by setting the WAKE bit in the CR1 register */ MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -622,7 +614,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); huart->Instance->CR1 = 0x0U; @@ -645,7 +636,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_RESET; huart->RxState = HAL_UART_STATE_RESET; - /* Process Unlock */ __HAL_UNLOCK(huart); return HAL_OK; @@ -704,18 +694,18 @@ __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) * @param pCallback pointer to the Callback function * @retval HAL status */ -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; if (pCallback == NULL) { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; return HAL_ERROR; } - /* Process locked */ + __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_READY) @@ -768,10 +758,8 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -789,24 +777,19 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -837,7 +820,6 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR { HAL_StatusTypeDef status = HAL_OK; - /* Process locked */ __HAL_LOCK(huart); if (HAL_UART_STATE_READY == huart->gState) @@ -876,6 +858,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ break; +#if defined(USART_CR1_UESM) + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + break; + +#endif /* USART_CR1_UESM */ case HAL_UART_MSPINIT_CB_ID : huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ break; @@ -885,10 +873,8 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -906,24 +892,19 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -992,6 +973,11 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR (+) HAL_UART_AbortCpltCallback() (+) HAL_UART_AbortTransmitCpltCallback() (+) HAL_UART_AbortReceiveCpltCallback() +#if defined(USART_CR1_UESM) + + (#) Wakeup from Stop mode Callback: + (+) HAL_UARTEx_WakeupCallback() +#endif (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. Errors are handled as follows : @@ -1013,9 +999,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR /** * @brief Send an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1033,7 +1022,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1045,7 +1033,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u huart->TxXferSize = Size; huart->TxXferCount = Size; - /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { pdata8bits = NULL; @@ -1057,6 +1045,8 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u pdata16bits = NULL; } + __HAL_UNLOCK(huart); + while (huart->TxXferCount > 0U) { if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) @@ -1084,9 +1074,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /* At end of Tx process, restore huart->gState to Ready */ huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1097,9 +1084,12 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /** * @brief Receive an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1118,7 +1108,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1146,6 +1135,8 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui pdata16bits = NULL; } + __HAL_UNLOCK(huart); + /* as long as data have to be received */ while (huart->RxXferCount > 0U) { @@ -1169,9 +1160,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /* At end of Rx process, restore huart->RxState to Ready */ huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1182,9 +1170,12 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /** * @brief Send an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1197,7 +1188,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1218,7 +1208,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData huart->TxISR = UART_TxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the Transmit Data Register Empty interrupt */ @@ -1234,9 +1223,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData /** * @brief Receive an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1249,7 +1241,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1276,7 +1267,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, huart->RxISR = UART_RxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ @@ -1292,9 +1282,12 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, /** * @brief Send an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1307,7 +1300,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1337,7 +1329,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1349,7 +1340,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Clear the TC flag in the ICR register */ __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF); - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the DMA transfer for transmit request by setting the DMAT bit @@ -1368,9 +1358,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat * @brief Receive an amount of data in DMA mode. * @note When the UART parity is enabled (PCE = 1), the received data contain * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1383,7 +1376,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1412,7 +1404,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1421,7 +1412,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error Interrupt */ @@ -1452,7 +1442,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) const HAL_UART_StateTypeDef gstate = huart->gState; const HAL_UART_StateTypeDef rxstate = huart->RxState; - /* Process Locked */ __HAL_LOCK(huart); if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && @@ -1472,7 +1461,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1485,7 +1473,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_BUSY_TX) @@ -1506,7 +1493,6 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1591,7 +1577,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) { /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1663,7 +1649,6 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Reset Handle ErrorCode to No Error */ huart->ErrorCode = HAL_UART_ERROR_NONE; return HAL_OK; @@ -1680,7 +1665,7 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) { /* Disable TXEIE and TCIE interrupts */ @@ -1732,7 +1717,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1792,7 +1777,7 @@ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) { uint32_t abortcplt = 1U; @@ -1931,7 +1916,7 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) { /* Disable interrupts */ @@ -2015,7 +2000,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -2110,7 +2095,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) uint32_t errorcode; /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE)); + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); if (errorflags == 0U) { /* UART in mode Receiver ---------------------------------------------------*/ @@ -2164,10 +2149,18 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) huart->ErrorCode |= HAL_UART_ERROR_ORE; } - /* Call UART Error Call back function if need be --------------------------*/ + /* UART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + huart->ErrorCode |= HAL_UART_ERROR_RTO; + } + + /* Call UART Error Call back function if need be ----------------------------*/ if (huart->ErrorCode != HAL_UART_ERROR_NONE) { - /* UART in mode Receiver ---------------------------------------------------*/ + /* UART in mode Receiver --------------------------------------------------*/ if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U)) { @@ -2177,11 +2170,14 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) } } - /* If Overrun error occurs, or if any error occurs in DMA mode reception, - consider error as blocking */ + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ errorcode = huart->ErrorCode; if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) || - ((errorcode & HAL_UART_ERROR_ORE) != 0U)) + ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U)) { /* Blocking error : transfer is aborted Set the UART state ready to be able to start again the process, @@ -2249,6 +2245,26 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) return; } /* End if some error occurs */ +#if defined(USART_CR1_UESM) + + /* UART wakeup from Stop mode interrupt occurred ---------------------------*/ + if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF); + + /* UART Rx state is not reset as a reception process might be ongoing. + If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Wakeup Callback */ + huart->WakeupCallback(huart); +#else + /* Call legacy weak Wakeup Callback */ + HAL_UARTEx_WakeupCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } +#endif /* USART_CR1_UESM */ /* UART in mode Transmitter ------------------------------------------------*/ if (((isrflags & USART_ISR_TXE) != 0U) @@ -2390,6 +2406,23 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ } +#if defined(USART_CR1_UESM) +/** + * @brief UART wakeup from Stop mode callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_WakeupCallback can be implemented in the user file. + */ +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2403,6 +2436,9 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) =============================================================================== [..] This subsection provides a set of functions allowing to control the UART. + (+) HAL_UART_ReceiverTimeout_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_UART_EnableReceiverTimeout() API enables the receiver timeout feature + (+) HAL_UART_DisableReceiverTimeout() API disables the receiver timeout feature (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode @@ -2416,6 +2452,82 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) * @{ */ +/** + * @brief Update on the fly the receiver timeout value in RTOR register. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param TimeoutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue) +{ + assert_param(IS_UART_RECEIVER_TIMEOUT_VALUE(TimeoutValue)); + MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, TimeoutValue); +} + +/** + * @brief Enable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + /** * @brief Enable UART in mute mode (does not mean UART enters mute mode; * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called). @@ -2424,7 +2536,6 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2445,7 +2556,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2476,7 +2586,6 @@ void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2488,7 +2597,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2501,7 +2609,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2513,7 +2620,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2530,7 +2636,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) /* Check the parameters */ assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2540,7 +2645,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2551,8 +2655,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ /** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions - * @brief UART Peripheral State functions - * + * @brief UART Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State and Error functions ##### @@ -2574,7 +2678,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) { - uint32_t temp1, temp2; + uint32_t temp1; + uint32_t temp2; temp1 = huart->gState; temp2 = huart->RxState; @@ -2586,7 +2691,7 @@ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART. * @retval UART Error Code -*/ + */ uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) { return huart->ErrorCode; @@ -2620,6 +2725,9 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ +#if defined(USART_CR1_UESM) + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ +#endif /* USART_CR1_UESM */ } #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -2636,6 +2744,7 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) UART_ClockSourceTypeDef clocksource; uint32_t usartdiv = 0x00000000U; HAL_StatusTypeDef ret = HAL_OK; + uint32_t pclk; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); @@ -2683,21 +2792,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2720,21 +2831,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2858,12 +2971,24 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) return HAL_TIMEOUT; } } +#if defined(USART_ISR_REACK) + + /* Check if the Receiver is enabled */ + if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } +#endif /* Initialize the UART State */ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2878,7 +3003,8 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) * @param Timeout Timeout duration * @retval HAL status */ -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) @@ -2895,11 +3021,32 @@ HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_TIMEOUT; } + + if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET) + { + /* Clear Receiver Timeout flag*/ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ + CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); + CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ErrorCode = HAL_UART_ERROR_RTO; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } } } return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c index 415fb56b..fcbcf4fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c @@ -57,6 +57,9 @@ /** @defgroup UARTEx_Private_Functions UARTEx Private Functions * @{ */ +#if defined(USART_CR1_UESM) +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +#endif /* USART_CR1_UESM */ /** * @} */ @@ -144,7 +147,8 @@ * oversampling rate). * @retval HAL status */ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime) +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime) { uint32_t temp; @@ -224,42 +228,74 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @} */ -/** @defgroup UARTEx_Exported_Functions_Group2 IO operation functions - * @brief Extended functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of Wakeup and FIFO mode related callback functions. - -@endverbatim - * @{ - */ - - -/** - * @} - */ /** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions * @brief Extended Peripheral Control functions - * + * @verbatim =============================================================================== ##### Peripheral Control functions ##### =============================================================================== [..] This section provides the following functions: + (+) HAL_UARTEx_EnableClockStopMode() API enables the UART clock (HSI or LSE only) during stop mode + (+) HAL_UARTEx_DisableClockStopMode() API disables the above functionality (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address detection length to more than 4 bits for multiprocessor address mark wake up. +#if defined(USART_CR1_UESM) + (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode + trigger: address match, Start Bit detection or RXNE bit status. + (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode + (+) HAL_UARTEx_DisableStopMode() API disables the above functionality +#endif @endverbatim * @{ */ +#if defined(USART_CR3_UCESM) +/** + * @brief Keep UART Clock enabled when in Stop Mode. + * @note When the USART clock source is configured to be LSE or HSI, it is possible to keep enabled + * this clock during STOP mode by setting the UCESM bit in USART_CR3 control register. + * @note When LPUART is used to wakeup from stop with LSE is selected as LPUART clock source, + * and desired baud rate is 9600 baud, the bit UCESM bit in LPUART_CR3 control register must be set. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + /* Set UCESM bit */ + SET_BIT(huart->Instance->CR3, USART_CR3_UCESM); + /* Process Unlocked */ + __HAL_UNLOCK(huart); + return HAL_OK; +} + +/** + * @brief Disable UART Clock when in Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UCESM bit */ + CLEAR_BIT(huart->Instance->CR3, USART_CR3_UCESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR3_UCESM */ /** * @brief By default in multiprocessor mode, when the wake up method is set * to address mark, the UART handles only 4-bit long addresses detection; @@ -299,8 +335,108 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua return (UART_CheckIdleState(huart)); } +#if defined(USART_CR1_UESM) +/** + * @brief Set Wakeup from Stop mode interrupt flag selection. + * @note It is the application responsibility to enable the interrupt used as + * usart_wkup interrupt source before entering low-power mode. + * @param huart UART handle. + * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUP_ON_ADDRESS + * @arg @ref UART_WAKEUP_ON_STARTBIT + * @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + /* check the wake-up from stop mode UART instance */ + assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); + /* check the wake-up selection parameter */ + assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the wake-up selection scheme */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); + + if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) + { + UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); + } + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* Init tickstart for timeout managment*/ + tickstart = HAL_GetTick(); + + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + status = HAL_TIMEOUT; + } + else + { + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Enable UART Stop Mode. + * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set UESM bit */ + SET_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable UART Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UESM bit */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -312,6 +448,25 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua /** @addtogroup UARTEx_Private_Functions * @{ */ +#if defined(USART_CR1_UESM) + +/** + * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. + * @param huart UART handle. + * @param WakeUpSelection UART wake up from stop mode parameters. + * @retval None + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); + + /* Set the USART address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); + + /* Set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); +} +#endif /* USART_CR1_UESM */ /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_Keil/Prog/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.elf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.elf index 94b7e2eb1ab3881810c0bb55f0e2380613c73276..2d182f62b885bea1083776b4d07bc310f887d5df 100755 GIT binary patch literal 423636 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ⅅ7`2-OfBQh2@I67Ou=s+Q2+& z`JpH){s?GTDJ}j~X zqkJ9qx*ztA+*^Dj?WR7T#KE0N7byG$C@B7>t$gAaQRj`c&N6Vyf-Up3RN$nksdcPl zVvrT{K;Csoxorpwl*yFUn<8-*-oxhPH#4%153f5pE(|CPh9Xpb_bX3o-P zFWaAwa}tYRIigx;cCNGLbeNOWAy!cEFgv&A$)%HSV$IKQ{&=$o=R0=|JiW9EYpJW2 zji|YLNy_1xEVbKFzrJDp=5>=Z_fwp8?ChG^%d(a|rF5voG2>CDwZ9 zCYt%(8`k`$&^__CD);j$=0j~&hp$4tz8Pl>Zg-tC#ACbqO8pnb9XDR>Pyb8$>-0SE zxypWy$6b{6W;Jp#(0fUXBI5GWGJoo(SX(&$QdOeot;D-1S+em=A9Lq)9ALZhS7X1F zJ6FfgWvk=oR6H8@RxohqvssJpS-dCzURGSAFX2`1Z(b65+WXl)inX7;l79zcvEtS7 zfsEDhg(JEs(gBzmO@$+U{E9T9l{#Xqa zEmaR+kkKC3%hLi6do2fecST($>?xEV-<>$|R${9MEC^E$xG@{1wIj+yq)wRsbKq
*t20ur4C#e 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 @ad z;L0!d+xSvu@qXYtM3PzjQ;K7CkL=R#CY>z4IiD5z{^7E~h8B|jY8r9ltyb?mE_>&o z?494wW2au*%bvPM_Rcf1vmck=H}?d4JxVE8OFa4AdF-a|_6FBM`)!fN;cMJ1w^jem3+K{0@XA@sR_8hxHXl8sK1Um;0#i701;Lo&%X zk>nfL0scJ(vfU5#gfcxq_FLJkPswKe)@s&`vRO~dX8lMu>z}>N^1|sCWY_&1G&Gbe z`$p-y%b=X?6aOU3xa^#|6>$7rPF+AXzP~Js_%~U^qw@RKzF?TQ(_0sm%Krbfp7kG) zGwN>uHcV%qctDQx7kg!A0n#$+Dw&(5d|>WBfPCN><@}FCIjbALUqwLRp{QN=gTGxg zwWmHdg>Q?0|Hm-r*Qg)Fa+DJsoa`4TQ%>+xc~auz(BwE|(0#)m&eqrK{wtQ+v1X^= zRp4`>;wSPv%H!akP4VUTK;NKFOu7r4^rxjf;K_Zh_`ZJvL%+SJwL<;GzW~=gZ1_Xv z2)t#YAF@w`|9Gey&Wj-d!1sHCTkvadZ->`cC$?@cErsvHLw<29WT3w{T79!zq{bo1 zjq?Uf50n0cJlKL80Fm@x&To|uT`dKIy-P&M>)&LShzA5q`!x<}uCfnrN<4;(HD_z~ z9=9rky?;YT;f`UAcQ)2II#S=mieJ3!Jugoj9P( zA6BW(*^1)Bzv6Bjk6ya9qIT)lsKD|*CAduQ4D&r;%xg0t*5G)1L$&zk1$7Ng^_81M zxV2tyN${~?@j266Al3z!*EfiY;Le>p_wBswvdgYKL9_;o)z7y`&2K&_EdGYgX8VXX z9~Tyv;Z6|ShtCX)kNV6&v?#x^3as*bJi57(d`C^kF zdRLL1J0m;A;#O)p`EbaZmQ-{R{aSskOia0G1GKM}F|28n2sn*=5w5uv(_0%N<>4(` z!wpp}nkwXz$>JtdHC)kf0@U~lb&L6iviN3>nV%0OubcL4UvjQUlzbR=Xq9IR>PbW? zKol9W^A1FkUuS9_j&CoEE5|X?%#yylZ|oNxC4JxjqS&A55z{g~9;*E7P$w@yFZA`? zf%hHydcKP-Mntg=3-Z-w@#kFTw65epG#sh#MTO56U%8+pe4qzn#+#M->^&hB$CT=VKXclZvpcygQ>F2t4jC?eW}aj8MC zpDiv|h0N*3LB)%qV$^cmfu5gVP+V4jW*GWoC1U8Rwre0LX}jVaF)y>d=hM;EZNpmH zz-Oh!AEC+~#?C2AU%@}8S8IlY&rORY*y3v*FTRT{ z4$;fbp3h^8M<9_pYZeE58}xOk#Dw>P09@g;5X z@ri)ivc}S$o?h(RW^rP#Ofm}&>?y+TuE^AR&kKAKYH;DQhV7->%QZyEHT=%WxJS2) z8h2)HU2c(O=kE~v>}R87yjv!jJ%#1bXiXBTjc3G$i&=A2U9&(i0LDQ4B)v#YD3B3>uv1jX(;5eU|ZGfKq0 zhW|?qRRxU&rKjefnqM0@sd%;67!=#;L?l=#>Pp1=px9i8?Qfo1z%DR1jHi}p7?PR4 zJT<$xE2o)-mqdG`Jv|}=F_C}kmVLc#aO~_B%i!4UsqF*P%=zuu{*yQH-60M0Vxhqr7;rI!>HlyC33y1pTN=JqnqRcaW8#oi1gR0Rnr z-ChRtm!I%(j89H8LrWvBUQZyM(tB3#&7eT|_;R6@XcZs6BviC@OMSi#iL#=fm~PJ5 zyT#MnUz~2vO-P?6se%+b#%LaUSa}SOH;;WIdMK0V<2|Lg7Td$Z4esR)|B!@wd=;rS zN`TGrd7`V#-}b#8IlFM<@_bM-Pn^#KPq*UO6Xap%lWqHnSts&KDl4nSN2OHy(D`Jk zzRQbHuo8;-{x9#_ckW(Xr6UT0yBY1D!Tc>God-=E{9OZ-4sPs0?0X+a{`ITxDZx74 z^2%l)Sw^w-Z{7bmHAV)kpi+tYa`+_IK@r#AzIKPDZd*FCUiVLsk z4VD++bw<5`A~Spp%;7k(+#Cvd5a}~G)?ZdoR*>Ij$6M}nj z`7`cdK~W!^rS`(+=)JHf`hr#PzY5%Xj9OPFl-8|nuS+v^s}Xda+&*|Z-Hq?h%J2V3 zx1P2Pq_8-?^-Rwa^N`Q1WP?67g@f?>6!*$6nj%RLXZP*DQo(BYf6o#uUbVH*L-$>Y zo3kghHXz1VCo`8HrDY#|2;_yruTD;nrDab4JBP!3>Djj-&7UVR%{7_sLP?3-0R0D_ z(L*6#_Kmdejqg#OIccxPV;S$7OEQlDn}6)hpj1yh6RL^#CqtD@4b=_nVip@chO@r! zxbt#HQLZq`WOCjNay>+ISjmF*Y7a;u`_&#QH|bY?LnE+xq#~qyMvppyeEg>R))G+5R0^e9x zURIG`QCbidar=Zxh7m5ubpz!L#r+AvlcJhCzMWxT!dWhQ7xe{rC8@;*JLB%`r=93{4(cy({gy>)|^ONSyW8B zisxnO3-C`TX=V6NeP&US2-ji%d4TH$kNuddibbGAv|vZ{#BQ-Oh*Q2!5PG2y=Y_z6 z>Iyx`e6AB_QH2QA;jlBrFnA>a=bR;9YGqh2y6VF66x)90wIsX>G&o*rERlM=D$>ZT zFRnn=f5Ia_rKN#zS$j`ec~8F0NIuNKt8q(&?eiFYZibJ;G(Jl&T(>i;@kG56=TyS$ zJ2^Nv2;uR*pe=my)Bk5V=6v0-LVEnh<*|Yu&*6y)9b+XuE`rpetgJ%%70V;gt#4|D zdb=j`5m;65;_#}DOtP;p(Yea=hCu&YbYJ=rXv49U@!hmCS~y=Jb-6~lmIUxiqiw*w z>&5T&;0YD}6tj3$b*_es8;ve)r+N z)(H5gXU+}g=YyQSI)^*tPoL|Tu8&IBZ!Fg*a_j}_8m9fvTr*Ot5$8er;N`gb3NigI zF_3{+-M=i_ww=iS;q!yx9$sU)IM^e0k@>nLDq8ErO5E4htMgl&^SFUtPr&Ol{CE@}pEdp9o_1)H{S;jXLT*jEX0QD$2s8QVZrASm{c;OScC^HF`4~ZZF*` z&I*d9!R6)UWo6;|deL8pH*>`4C88|2l?$WJ>hc<7_24)&P=!Oc^;l4A>PzjX?(bvZ zvk2T-U0fE~4la^+ZfYj7FL|lVz|Lghwo`Orn!fr|+ zPec}eTr|~(D@TJ=LRlPC0>8T4V$og#iQz(=A7bRMf`xw&x+*eyU7a{3C^k}|C0arF z=@#FGcoIj<*LI5+QPAZmDC*zJfs|*0SK%vXFaI$696%GdM{>mD$Pq7j@qX2x8vwkkrV6M@bpoBAP~k)T0uFvenNu5*z~5zh9j`_9b3LF;-x*4 z8j7bgLtTlazdM=oOU}Z7GM>{7^BKfUGTE0N`P^<|ptEnND}GdO4t%>c#*ZR#x^W%W z!OfM?SWPOiC!RVwkJ361e2syzRqO6QAZJU)wSpMu5d*wapuoP8xs9IB8o1_8lMRyV ze1*|M&dtqdGulTWm9(Snr_ZOruHqdFi-Wz2UU(?g=#Cda&V0|ebc0Jc4qyIWy z_>77rt)(D>ARXxyXSJ3t3zd~$*HgdHHwSyq-;!&1405Xx!2T8^&36MOaCExNdp`DP zmhoy^dKjNEJiaO)KI`vD3}CwtKS#I;#VLDZZ}fe@Y+tqAm+h-guV(u?FCLCyjma*% z<+Dd*)}eg+Wphe)Z5b~0!{lyfFLyiTOUU*dy^nMBN%?Nt$8xcemjPS*&^{@pj9_!` zUhEN`*$NW>V%SLnU2lqm=WrkE>+?&%EoE@;ui7S?qk}((6Jt5zhtr{B z)hecUi*H|$wU73HlXbJzxbbV%85$8IPB-e0D+ub@z^+SQy$z8Ml!Iao}QsC_ycPzd|+Wm z@o`ZXtw*fSoafiqFifvUk=R(wM;4zNXQ`c*La%k4cu|yyM@6gn?Y@h|$8-N8o)UGw z>1a?IVCFMMeVdq%@TD^ysm#zIK%l?4sC%7M^1?FuoVaVK zZ?{@hMxc0LT1)y#Wbbx7M@Eu zi=7ltg?ou;v`<$&%~Q$vc?6_LBi)^P6VLWg0#!JPtezqI`8{-c?Wc2JpwIJepPVRs zaE(piv=cQJpHHuEVvjAX@mM~69^kH<_6gJH3ZGfnAPVsEd=QUqFM%RlXi@FjhJtXV zRzjARwkg&EFX6JpkuJ1I1&5Jn5tG|Z zU-cS}$M7&Pp4;gf=vkfGTpD?Glyu`zXBake+Ih1YA~ec)>s-nUWx7;v^j(pyzf z7nY$&oA6irUZ_Xb2AGAfpCB6izJa%IEFJ$p(F3xrfWC!2uK^yvqla}?`gnT$H$BEF zQhg;o4wz;{DrU>K(4g5}gcH3DVo$5ymN|>DaL+`zes5%l)_%W+p5I2&u+HpO`rxFO zo%=u2<3C*<-=fDKkx`jW^JDs4h+7qGpQq^aA?Wyt6+v-&u&5L=IMDZ!xEHfawr`iZ z5x6Ezx3YZ;68r>jt%j>E=HY4UBwm6C|||-jVj#pfc>P^ z0liamkRjj2f)%y5lJ2Az6hmBIhv@YikJlsgdJ*a)y>`N9>GfXWPAF^gNsrh6GS-(o zUQ@Ti>pLE=)o^$)^JWN{8|PJygJBN58Qz{xgi&`uv>Y1^llJ~!Yv-^th*=3X)N+I&2J;uGmQ zJfSqHPUGF181+(N7KB1YxUXEV1wWG1jWTtp7d|3l`g)P)Rxe*b+jEMHp zt`+q8adx~YeSx1{sjCNvYE$RbB+?zb`miS{T^k0ZV`w0q=oyH2`8#_%Qsk-Z|INvv zRA;>1s}bA2sk*wob8ranwf7H#&`I~=6+^$BNn#*_EzkBdlBwP8>7=@Iwteehe4r}Y z(%#ZR*1es2wpqCzR?oJbq#9D}8tO4NZQ16pjzs)xvGp497lkA1!bOoa{uQZsU%Vq7 zKf%8PRSm`acg4H9;$5rOuG*FA80hTvr{a4O=|pnCU$lD7nn=-3|Em5>?@<3P*l0*8 z$S^!Szp8&7+}(Z2j?Ai#U5Qe3Mi)I0p?h%8npNq+Rb7#_{#8BxRa;>|^OW`s452ow zy1R!4Iy1r|kMl>30s;-W0if5W7!B|aFEzQVAEH;El>tib4 zs%_2N4Q8%0X-V|QTT+Rho_H$W)sV#AbW=@BlhMKK8l%zX%G#RR)0-Mo;HFz7WYp9) zS5`$g7#kCPnRu$UYjdKf7nI>Zk6-@rjCpFfA>Fe%-q96L*{wnyn}!?WY1!!7mWEi< zaMe(Ew<|_vS67Q2BfB#yYqq;eV|S^F$f~nPAO`L;Du*)3Gdgz1w++hArg#Q}p6*Yi zIpRiRb+o=H#@-o<4|MJ`T56(AcKuYZH%B*YXpA*(*iuuwWs@$VBfZ;duk69$hK@vE zRdU$w%jSIpopnR~gJ&eVGQGxzEwZ23fR@_o`q;*%4X4E-;mvJ!QMCh!%oyfYX9orR zO&h~a7)+MDxnrQKFRn*W4RCQ0M%aRg^+QHwW0h;nHlx9=_GVneg3MKR3dCv~Hf-J2 zV!&5|5c_EN=KaRdUJZOk8e^l{ZTT7*fKYNs!I!J0^=RqF=7{Rqt@TE8U&kJ>T96Q{ z5v%GL*eyq=YAC(6yW7a5<2?~H6Dg`Y2AblXaqRIoVuHkhJkV;Dswv)+NCWWfPFGcH zOeK=WhT%+Ymuv@$$qc1+52d|HjmpjL&e_<25?cuLETw5!!K+TIl2&30@9E%lHZpv1 zo%edi(C)-Q5Bmy}h+mcIbR4Zi?+m3dp%eS#8BA59Th5efuz-mkqeTHC`k*_>N~aQ; zeMap7Fu_1)+z#E;m)zCS$GIuHrO4Q5VUvzNHVwY$BJ`V8u+>@2Gm42H??QVvHyO>D zE~`JBVX4`$v2t6q#n`y963rguyzc13^ zboz#xu>FOxv;2zeuVVXawIPuK>XRB)W#LnOG{|`sP3~2QDQf^Eup(~r_U2Kbn4q{T zIV@9hI_Y6!*QJ1J?760KIaBwV|nL zYm-7hUCALXnz}J;gVmhcE;c25+H>B=h_2;C)eX;d_SOz`#fObFdtT2g8|QJT-7RY7 z3}MsoQDir*mQzw8)W-Ng7a`F?1jR)|YU((d+w;aQM6NQbWzICyrCJM%T2Hj6os^Rq z>jgj!`-duykr`H#&+3h4f*1Q(BD*GH+Un$Bb3C;t0eFYMo)Fed*LkaOc-gb>p_$8l&O#jZI;rxw=Yr(OB^E;1KX~b+onyQ>~@8iTPF{ zUpAp8F56opD^OeA+$6IvGAgS!;u{r{6{*@-iSDRwW)9U1sI9K8j7GO1LanN4OLarF z^oDbrQCZsr7YH@o38{{L^mZz3Bx19VrQvDd}SsfI;3T zNlLD9s7JG^xU8+K_N-|GYbv`%wYIvEH9!C;jV7ZzmF$FK7yO{xK_rUR%}S6kU4j+ zWwx~g-ARKpO*Yg}WyiRfI9a*Mm-Vq?)piZ5IL&(#z$_}3(LOg6q5>XMxqyEPJVaGAj}or=dg z^|Y0>Q{}1VJGI|7AUj=ltSm4it0fyL+ha%FFdS2fyAvtb=*e-F0j!Y5Whxg{byYBs zN=s7p9q@|kUwp_Rgsrm1hXkM3?! zKtddmSyQ^GxX4TXYzEu0w<8tb*q7W3#F$Be#MLR~jFOas0LZ#avJ@+dwmCVcC7pz7cJ#!WTDNR4I0LZgafP#ESsbSA)(ZgZ zvfhbS>&~pDb%U`L8lTM_{eyj6;Ox|LSY+kpmu%v&(L|Ki*dd848K?`9P4oD8I*WN& zpej>sf;CpE{*v(6Hi(AD4e(+ln=N{MENpa!WD6IS%4lts zL`Ohq%)`!$aBEbzG)0a61P)PQt|bS6=aNGMAc_?lmK_n@T3Lfta8E2v!p6WW*O>QU z5%wy2L-IaYBC$IG^hTWx$t!|G>XfNKM+_!Gt)z`@%~i3jEt_H%Now()MD?jX@vhay zj8GG6Zrre;CbqeD(`F-<9Dw*fk%@t?Ps=t$w^rA0s4;eRWKhR_nC%F`AjaZK)({^A zh#0ZGK(hU)jihg5J$*xQBR&|GNHo?LC)ZXJ+t8@z?JmVL?j<@N%%qIH)~GO6w6P(E zY2naLu~?>`SRBep#5uf{zgspl12Q4jPp-F{^mt-0UWJ`+azL@ZUELDt@_lf$V^i&x zmgbgb14u8Gh^LKMJe3+q%1ly_Tx8<0z2G;81`S9;Hf}<+F4k&WdY1?Ch@)6TH)|j3 z9!!FnQ2l7p4Y3%83xpHAW3hC1tQ&cAmxxP8tbdp4qg}Ne^F1AX1_rOA%K)fsZdPad zWr5utonYfqt|IoH-oep|bq}ClIzfsg;;J|S0l>jV& z!vlN7^-Dq%rk3tDb|LwihMrV4T8UYO#-@k*u!IiAWOs0Edm)rE`Ud-B9c0u%mZLvd zP)wJ?NZ`@rc;R{D4rG8J$&n3KV_i;j_R6kJWs-Y4(^e04^>=6}9l}Bf0aBt9b-+8F zgApUvkw$6#aS2VEnpAIPhGPV!m|Xq#psSNzU9oPE5~%pzuC%eMiBbp5ycih4E(}c- zINX|KG6jkZ{A(O?H!zusr;n`FU_q#)bVtid8fDuy)z# zK}OZ6Gm`?O#DQRXq|`(Aw9J;xZzhcaaFf}xGp+fF2pdPjl}xU=aoL6F^?uG&BF915 zpUuf`ok@CVS8@=`K46ezv9GIRpMhzQDT(F5$Rsm>5G$?BS@L5VDmOHS!I(E;Q1==9 zZW(UY?CG{G7ItB;SIZ{GFeLzvg9Ir;sSz7o1Hfdlds(c?pGXg5!6E<<1Tzbd%OwKX zC=E!!RMQBlAMBomN*eFjMUoHFt>p^hAj5=G1KH7#PCLBsrDx&dwOx z((A>_auT8&(2=n!g-BzaeaUp(*ab30!KdmaiPocA&mdfMCBR#P(6&HCA|+$f<}-jC zij7!LM?YFX{E9Clk&dBDx(pi?yXG-iLO?hvN1zNaW?03D)i|fw16&DY*Xy3|PJn}~ z+Rz+D$#_8z4IPv-l^C7~vL8~6P6J3Avyw!oXrp}*Fu z!AhjNP!TyO3W799N$ydjF%*i$%^2+67fWP_3)wP&+5o5o$%b*!EqCYnNCnHNQ_ z<*T8&-q@_Mx)MNP!87ESoH>LDF7?hTD-ku|p2cuFC3=QZQVixTO?TuvHMfYZ_!R>w zExUnTqOh$TQ_KztT|n~?QVxQ!wWc21tP#IWmyx=V{DNFK-OD<&P4;zZIKe`x7I=x} z)f(w^BC&_j-!VL>B#I26P(aR(T`btDgH^7=QgLj40F;qeU!O6M0|Fd{Jw26bzu7x==FeYsZk*si|a zk^(|BFehE$-@N6si(~_L16Ogq;{bV=9;}L(gN>33l*1>5O>z@L1wo`ekVx)I8+$A2C0C<;GsY&M9IK>%WLb;wTkH33G*cofVdd4~D!igKVMWe>%B*;gQvzYvS#Q16E=K#B5QB$O{-7B{hgBSyg zy`B=TdSFWq(}m&8RFcA*06K&P#0GNQ9iw1^SkSecV4PHg-Giv;NI5hbPIN(<2<4Va z?G_7pX0RTnp{wF3+(8Wyp4+oT#g+C{2K@QwAY zUELuGK~JSXae`ePm6^6Qn>wW!Qtq-sPFb6_KoE7)gdrNm(U6R#K^jAnh_Qaql0ao$ zARW1rYCG(jF@c?lY=t|%Csc}cMw@#&1zA$mj;lZH77Du|;FIoAW-Mh{NWo278HFDz z&DMrk?Z(&^Y-m=iPe`1ZBYISc4r~sip<}pZIEr?)b`C0(Y~klFopfu<<_(ZmqB_== ziiNq6K$c3|)t#Nm{;VQKYcOJ==60DnYmof9*rsMkJq}yvCRt~!mFO%`gQO3zcQLHn zzy?_@$DCmwV(}&oDJh5l$KCsYSyg3sqKBe@lBTPH5JPN3S1WC3Lr8(NO&ekZRbbH; z#Xa}lg3{1JLxErlsD{F(9byw3ZDM%F7@r}=cu7CwM;yjDe#XZ$rXSOx9pdNkh>!UA z9OLKL&+$2q?Jy28j>FjR_gibPz1O*QOT?I-%oN||x7VM&_S$Rjv(G;J{J9N6xo#_O zr-xXJ5`62}%sUk_Jq)pxJQm2tz4skM>*F4sYRbM6R%AFnxXozyjJIdF+z#=zR)zpJ zaAW5>x?#5$w@YoC`-5p7bwfo~IIS0%6*-HmR~0@W&^w45>k=J^I29sP{TS`Mx>2=7 zJ2nmUOM@ynzZ4qOft8@CVfdh^irw5<(8qwH1}?L(;kHQH)xXBeNqMA!y(FPT zU}RR);=HMg>zQr1#FyzhRD&w%G?p?@Lm((cAjFcy)^5cFD_Ei90#k|5?q$n6F@Ucr zEnU7dTU05Rv+ni%i!fbadltu;5pv)xuU=PzE_!AoF0c7{N35M#a`n>fOShocOPjW! zW!ZAshf$+(=MR%u_j=rW#cin)7s9+%E<>r*Tf&V8h!=CL4i|6QBDb~7lf_*3c6VG` z&NyL;r;BlgD<|!N_5E-P|1Zak7n`Bm6U(+|IJwJC1!pbuT!zi^9YgAUWTP30$y-p%*o*KT-9NbmDl!`lv=s6^BT=z`9HfG4ul=SxG10L&M9H=JO0Do4 zUqg4}If6N2F?egi%qpd&AvP#EyBMv-ebuF3S{=lTt6i==Xy=uyI~RsZ@qh{4%-9j3 z`MmzXB~FR}kE2TH7&@_RJJw=ygpdkt3(qjIaRcku4@%Q;dwhxP^T;SbLuN0zK6B0d zVu~xH+FgQgA&#y|SE!cbgz#X*U?c^{@R&>}ins&?eR@XP$3}Hka9uTfH7`?jSaOV_ zn^|k9q_Uy|*BP-w8-sI{@L1R=gNlyCFeo^L+ika+1a4BZb&JZ^O7lVkY&+bVKRX?w)UKAV zSnYG0%}Dwj?t86x$MfrxDw++rC-(#@7Z17+b-qNKg^#P{R9e9k3_X)b$Tv6l$6HD-dL)furkQhPHf~%>?HqJtm zagyQNgpJ-D;pb8DlBc}f8NNuhjzcAsWY1Zre@UGXRv6`Bv~lo-0`v)P%F`)W(eU}0 za!;7=q*Ha~a!0qDy4V34f*~|~yDTm^k%Zomn*EpxqZcDYU85hNcR1+Tm*US3Tx@LV zmoPaW(jgZo7`;<0u@2La#X3x4ad6@kR$jaU<!63YGTq2{<=HxypQl!vXGwRG7H( z-i4iry*mWf4`6qbV@d`M0uVH587{C%*z@>$=B6WD_lcKwzd!5QDkptD>W3Aq3bDU- zb1ck}$5^o*8UG8Hm3Th`|EndOcP$R`gyyoX7&4NM#E7oA+-s#(t)!H8XiK-E)LZ!>cmk)I;gS&?NctBaZM!)(2n)k z=jrTN7NT0|T(%7Bg4mCtUxt<7uq(#8Q@VResW%nY+J;Y1XbqMgWmQ~gN3WZlf&((I zS2`A}qD&}};?tVqW$4;;`b027i`n=PgJ98(sSqVb1(rElbcs9|p58pKNr6wuVKums z`@Ci`owm6dhNE@!V3f&q8Fm$VwhrMUA2(Qd3uNgQ>}KO$&eE#hL=0|m(al}E@}i~s zR4n;+^4h$8o8GOnTJ;&wC3u7c&zx?*k*8N)(q`dG(3#e!8u2JuJ9~FvJ+7lnSr)I` zb`0WXsM+Pww3C<6+K_D=+n`u5a7WUKf#tYjNRK#k~~W<=?>lcd5{9$NJ`o zYBXi?vQ~p=hAW(?5gxM)6FEA6^`_LvT5NW~J2M%c)RimLb-WpC0vUtRzHz15!?0^giATr=G^FSoT!m~|yKU{JA>49}wZsCg77E zv69gK24ORGxgOG^&REg2_M&HlQ4sA%&YWT6cPQ+SY!1zoUcSdp?m+&Np!%RC&W zJ~S2w--t6aFH^H+nDsCSu1!eecC)Fl*?>-I2oXpP>mgiep9rIf1;M_gPN z4R;`0x^R)6zQr}C98Vgor(T$0g9x9U#dm12VGLKXC9@h&o#~So+DLhvUb-eLFT~Sv zp>7wB!OD)c(KVj=umiVb)B1t_Oe`$k!XX_MLV0?KRR$KQY$MVZIcefqYAj_ko@}@G z;AMmqe-sEa2X-6QuireF!h!mEA9m}O;FNTLa&*NPR)BToc-Sg@kkybC_0I^pYX)HJzdIU%3=|o zL0z(STm3_ii?{SI-+=9Xz3Cb|(Yd;8As*|+Fk0-Kbwh`16h0+`H(+*b+Y+ABkvD>_ zoQwN0DU=L3pAU_XaaOTO%3JhK#r!Cqmemn}Pw}LzwvwUjS&qj5W2+@Lo$~0s z3x~x))mCEP38Co54X)VoIt$nj+#u!A8(7i~E@5|OLf|RkRC#4_M^%HPOf)h~bSulH zptv0Gg2=PJa&a7{%BYTh_o}OT%PSl$%LlnmrSI9I<>jzy+dQ~>P;Q!{R0sy%!dUyw z6h=Iqx_lAL1}nTb!rSESndN5lVUlflSO(VhIfUqq&L{f_6KK?6~g`%azMT2fnB zt?O|Kk2@tdN@+fnfo+EM+w}5^>nuK1`Xv!c^L5=E@9egB zh=`ZDTC2?+A!H0A+o{pUvt=ou;M?;kAqcQw9CH#;$9pW8_NYSdptE$#;!<={1j5Ab zxGPl+i|nj(A-i4vcfEtLZ2f>6`C_DNd8N9V_kgm_6?h_|)Y}~c0+Hu4=z|7uUwKu{6n7U4i*sQQ0MFW7F$YinaOmrLQy+0g3&XR@py8U zUWh&H{$Qg@ZmT#jeOSSRiApv3Ks;X@8j=;^f1R#uiTiCthFJGaoW@nJC7MBF;`RTJ@y)$phc zlc~AWutTVuF5S(mj4os2OFWhtCd{ZB5m{jud#a)v!qMqYJ{OGu#V(s|U3O!or&QV0 z8Kac;ykLAMA6WhxUpF(aZP%)k!^W71Y#b|e$(k1ZKfi@8Kj*VfCm6iAoekn5i+&7o z)xtU2- za>}HfBab~q|2P88FygXf5Pjq3svv@?MVvJ4&}P?=QK{kty?kX4Ziy~lxNLQ4c{y4` zku(!=O1AFA4vkHgW~QTSVHr=>;gmC?E%?SW)sn4ZN1R#SQ^ldYx^rsq??~$VmM4IC8=%`d;fU)4dk+TvOjl3U#QPa8U=1qLfe{f)6FypOHnX~Ytlj{b4 zjZetkh$m>kMx4955sGenjspMX8BThtx==RfIMK1P<=fYBhKxP2vK((J4Doqiya7~M zss+0&BTf#;(-XLP&)3c1%+2ezW?fc?J~08iLCzA(aHD?H%^51hMj<}#zm0Xun4?rz z+-N%QcerM5|K@f)Fum^Auz&jX^9(FMwYx4>5KcX;!L>X1$IwTgMc$$9v$$B_pb=qx zYaGnw@|goUnh^(k+W|q>Ykov!Df)90K8L|84ZSq9(uhW|hoYOKvpg4lbGy9gD|Ssi zoM(9(&BZ80*QyJ{2sXq(oxh&Pg7DK101->i1gkr7)z^*D!tXbj8!(+5H)fCC%<+3E zG!f!6TiStFW@l&kZ%%m2Jh+UND))))ffer$co-0~S6@@cJ$+oQuEX-5$ExY#s4L;| z8E$J}=WNs9#$-lCSX$u07ip1|2~jjsRtR#b9gZ{;z`(*Ku)ex|^%t}7A|_mA-N~o2 ze*UD9S9;;`;b#L39{J>Rdgw@-P{N&ttkT=ju^5AQm~-=1&;CN<%JC>If?|k2PH)n! zA=;tWanGNf!+z=9iY@CctLM&JMnj<#A9LW5CmomAa;q*0wtsCC-z^9q_z0#O*v0cN zJ45}!76u;mdR&ziJ_JziOV*33B~uMWF{wpwd1o+{!@-0hwPT2$IVIk+Pf8665AzT~ zC^*TZMOogNz{A28R0AxyYo-QUF73blqYjdFL@FeQYOhUx#GpjJS=W%YqVXCK= z6k1FNsW+s9&65xw`O-y-K5j+h-Ptrd&PgIX!tRF+My#1qyVgxObmWeFDk%?EnR47Z;SWV+~kxiSOjpVN#6vG{>8=vq~2EA_vC$((*VE?8K z+weAG^pKG%+6!l#5c@D)xY!4`Wk{qc#wnnP^$iDgoo^_@INH)Mv@RKv136SqMQ0ed zDD;Uu-?w(cpq^EWWnipU2A(w$U)9=%Hy>l`ht-acT!eLo&YZq>bQv$%iqV3HHjHdo z^jxzu<3Te_(T1T@4A~tcxy6xF7eLm?_13QqvyU$JJs!pv;e#N?OEyNTo%=^Mbjg zjlFYxov6&~rpQbSNsVi`#^CppLcF;Rv>p3d8D863Jt%L)>6`vt9e9HaFJktG_kLuX zM1E~+1z&3Ajs#Ss!-<`E0eRy(dD)pFdHM+NM0MbT53fYUs}wxeSjBg3taxG9SD3O) zE#cm+P-3RTO5^$TD(;*O;@LyKi--5A^>ymr@*;IWoI%W#ofb>N(o=u>gtF)WU{*ycTl%ySl#n2Jvxc40_+Pgy9i&` zLvC=p?$@K0JY@>lP2P8S-i&wkmi(dHZ%9du$7W0~fYo0~#yrbsO178wa-ywM#>7 zS8%u|=mQ+w)Mhu}*hJsxJLb~LPTr0ULmP)bUkB!1X4evYz6$dP1H*?;m@i?^1p&pa znjHh-4s`|Vea1RSD> z%a*i{q+0~;q_!G`KS+qPw$uu@QC{adp6B#4kFdz|Bo5TVNwwfXIP)k^=Vn-1h*uEg zlS=9fT~I4L+hT~x>`rd5-|+H?4OfeczB!2dsONc#ksmt3u&FE##d)IkC+~p)p2_jW zD%}*(CcsU(Ic{4e@KNt`Lg09tJJ<8sVHi*0QUho`dnTQc!=fp4PPjyu<(hAP@hVWO zM6b9i%}%%wvYqEbS21MadW%?qI`Qpma4h?2PWP7Mr7h(zH! z2?rnU#h{0E-=D`D_GX6$!flDL88f&J&m5%p*maVLMfG8HDLAlA-ggb#U7}Imv89S9 zN9~RV_Nloi26J8sUoYZ!&h#r4^2Ly79RpZC>NAL!<-$wJ^q2RS7MIjte)@4}LmA^i zO5yXHR+`~cVlm!gifo*_P&@DKVm=q$B@36z8Czbz$4;-s)(pA(&Cv>P3YiNC87vNM z+OlJPIegazUM(&~r`RLgxB7co8CrC6wr<0XoA4zVzXEIUrRh~X@Z^OA%%}VU5`GUm z1jE&g?}YTz(dZ#M3a?5;QUZ*~;p1=8F1bm~uQ!Df@EDPaF2gb{hA|K$;qRPV__TF} zJ0Y=FdW6}@)hqpnrzMif)KBudya{moOqFo^a|ynOgGZ{A#?gg?G@J=LIdgk2;kaxi zMqNMDP5XoDrU#!rz$b4AbAkgJ3yJP|_LcqCx-|;V=7qsqS&6yxIxO5o zgx;|>t{%jD;`mGpk14S2zWr*x=Yzd#6)=k2e^_K<7K&v;lXq;{Bo7&jDb7iFC)e`s z2D%*c*gcWYQ=IQ;w4a3y=Po-%gztidXl<9PHM}4n-lxIvRekAtv<1^rxSX-O1iTvK zq?ayq3KAIRj;UUW@cgZlYw`4~#luyFD#Y^_%OHXyob%J}vM(0eNY}ziq3EI4Ei`Jl zAUIWMQ^DPOiJe5WYu$b^!=Syoh@Vcv7p|66=u*Sis z2IOlhPAbR4Fop1uEg3&j6HMYM8+1gh$Yv!G!wSBowBbhaC6x*jf~$_4rM?N_qArz* zGl3XR(***C{@lJ^4`h5d$v*L8POZb6R&a`sG0D8j1uwpl0f+5V6jBN7$o+BH*@%xC zZP(jCkCMnh5z$;G)*4 zd&b^A=8op?jNaRH*QkZ9Gq$x(1>f}cLhlghg{>3!G~Yh@4$)cAbj|qIi3>jg{>4bN zH+OW_(k*%|d(_VI@vSWjKVkCSkk2p3SBSj6JyW1_0_kb!^VfwIwzhm5_A=ui1%H9^ zSx-h^so&h3wX_L8`Wa9EtOcD~)bXY}n>H)R_kyG&&26Wd1q zUEud1Ul&WMpYoR=Um)csMw?dl;xSpv-Uemcz+>5mAYY|rQ~YO?CH#yXb@0o`E%ZOq z$dk4ofD`0Ql@n(ta$m+|&5ct%E^s<%|z;RzC))|JVrnhezNa8G(On1pW!|FGStu zPrcuyhw$@YuS1W=3H>EKp(SgXtL0>DvX9AMP~_tn>uqJb*awskK|W8)6~``Rhafvt zCu`&n#(&m#LDoVU{UO~CdWMwM@k$x_`@pAfrgsqZM5kx`!{Gb)Tlpj4qZ@|xC*}KK z|0v{~6WBh|X9C^X+Pr7f@}sR_N7?l8S<4#G7+&$%VErt&2QucZAI#o<@cTz7bGELG z*_!x?7>hV>u#S1)?;XL`5y;xK{z92oz^`f(>-(l&5669WFZ4R4&NK$dKLtK*Gm(BZ(2N)9 z)1cdsx7ZthVyn(I#&6``-6%f;dTh7pu{`;m;4^RhM&(aHuMc`NR4*P&!xhMr}Q{BxFkS&0XM&(*24VSTPtgj2Q=~8a$x5w@ob9?h0 zqrYS4Vaf*}_hZBAySIT&lbwWYRh=)^?)J&iUR-Oio<8td-r{KbgWxxc?=JA!28-{0 z&@5y0Adp}sd9~GU1oO#wm`W4V6`;UGY&3rv=_94neDL*7L!ITqTGNWaHE##*v7tp}P8v}S*K^ar}`qz?alnXU^l zUQlLPtDINw7}a#$_-B5Abq20b*k>#=^fSYcf0NPPTBQ1U%IacYFVeACYR!%wrwb;# z40&&-PwcexjF;NAUrqNC$l8!dpMXDah;Hz?C%PNUoQusq z=Sjp!&Uv)sW6NXiT{wLdZEqJnTw7H1+Jd^2oq^2aM*8AU7wJyW7DviAf*wLy#-23) zb|GPzURZ~ieadb8n?7mtjq(;b{)*=b>b``!+95Yv6E03`1+(RSr!B_D^hq;sb+w`V zM$mo^vv%x-Y%gT>`xCThby0VuShJq~$yh)BT#6rQ{xM7@Crvw^HlI!3;%#(&dA5gT zOiq0{PQo6L@!Lk=hjzqk2Gd_4`o(@^T_&F|^3+eP*JOv0U##;#!aE@QR{cB?fbV^s zBQ|u+VlkM9m{q~Iy7qy-8?@hV@izL^M#C{b6S6md3NfCRwLFjfqSm%OEw_)mW9)av z>}~$d(RX6b!rnsD+VQPzyd;u-p#EFX=eT5>NS_AXF5_}aT3s(}U4WKN;ievar(Ro| zmZN{9F9Cfy^4ElQ8QVmDH~0&X_hZjw`yjgnvT*)fX6H|q;9x^i+6TO*7ADu$mbc0@9UT8d}Q%8{)C@z%x?#ubA;)0>@$vi z;NOOP{k&zddJ*z1B2Te0S=WrXP8!w+4?)Jm-gKV?T~#|#*JR^AZ$1pKV;^L!e~FHx ztsE0p4(yC;oN&BVDYH0GhUIshr$*xYejW>b()H(#xj%!oCj979dwZI0AGMatBkEGN z=yJV=GP)ZyV{J6DS(~GWAm>>2a--|(ehl{cw@Sx)-1nLbp2_$V=~x3>T+x-I$2B1s zKX~Rir}3~A-zodRZLZvY;NL6l(sh*Sx3_044>aJzM5gD4qCWXM zk#Nk$bCb1i0r=J)WV2Eo&11~!rF<2V+3|eFslHv*_k3SZA7s8f`_jsLJ^JJIj*OsJ z@8?MNI_vDs1#RtNz4hbmz^B2)-xS1qDvoVV{ z-l=H7**SVohQ|cyc~@ZEBab-(bIP8vca2#&{`gT6yjoT})O!MYZ#w$G+_X1I`Jq5F zuA~oxZWp_0e31V-_%?5np7@2d<|aKCG!7TJhe)~;^g$Vy6LDF#XZ-CK+|lx#aeLus z(+|cUKlZPm!6a?Yvdt{>=9O8?H00X?J>iSG##(6m0sZOv#dM&WJ%AK-ZcI8bDRv)# zotH!hYr5Mb^te1ZWklK()@0^EYTYL}KO&f>Xy!%TUk63S+Ez-3aZ5)PtDkijr zt!^G#*xI%^tj%OxK<~sas~y~%+cWA~T1b8OE@am`x;$Uc=~nhp&>ZW2y=Jj|2eLNE ztY0tumEn7!^mA4n-^womzs1$v1KQ3vEO$d4y#=(bDJb6!ntKil*{;0UF0kc(pw;y- zbbVcqfo_A2wetk%HK4`T+VL>9@DnBjJ6m9~6)HpZ(vN`bYLQ7la#cNbRk%+>ANj}Q z5p&J2+CC4*xXIoW8AfT_w_Em%yPacq-T31_IQo}i}tzt8slayZo#W+u z8p!FBZxid<{n;#=kGkg}kLw(sA94HYFJ;|I*$`w`i7mZ0WF6!`3O>gT+QD-+4o7`v zg6*XI1;{zRA(wNm@xhY*3*{tE)aPF_lIgvS@;tWc%by0H{bPJ0OJialc|?SgD9@qs&)Us$zAs64Uy5@O^jL<8bYGx-Ir0amtL*nOTlO2KV81x{sb$zUJZ)fqD3-jeD`17Pp8au4#EciOV z7WtPf&RTAE`d0UT@Hf`gZ8A)PExhRQKDR-a_22{(j)&;;b$Xeg{pI6MpN~$*e2g-j zM-b;Y#>l@Od_P`IAF3J8`}O)aji7%E_#9W(k7noY5%{$4kH1FaW!L9$-xlS0OjAyp ze+Q82^;zE`$d5w*Rph-NeD{e`5dB&Oz{bK7bwJn}4UkXaA6{A5T+$9``39_iV8Fn17{C&`8d#wCH(2e4Kcm)2j5%{OTuOA1j@2wH^ z>0hII-ycE0b$Meyr;Wg$H3I+YI)42)B>lkWaXkz@=8awzXpTY3H-f$r`A&}S+eh{C zg1}@4Ae#%BpJN$smOBX<^L`wY|2p`bBkK7RO7T1z#~<})fZs?TUkNJk>)S^kcU_)k zgV5`e`r=%l@p;d?kVa)C!tY47Lg15~&Dnn*RjQ$g{84wGDC7hxjFKBvBE19TA*80P zy+%}VDU_85PkW?9iI7XSOrY6fMRURF7KNN(3VHOT3~p5vN_~J|)vQ(Z2A+kz7_70` zgUy&-o*T}ev}gD3Z$)c-#6pO_+{UbT297ULm=c6v|Y%NQ_kp(y;7iY0<7u1Jcpbu2ei6$$;4?ImnPDmG~bI5!}T&Mx?IjhQt_2moQN@tI*!*KaIG z13d(f&PYWr@H?vPWert?a`fj|r>q zIlytvo&u<1pD8{9mMZop#onYC2j+e#-jBox6Q4zbXQ@z?gt@4=R6!v# zPqwM@x$$|@+7e-jWLFTrqFh2%xrFPKOSnV1gu9eWxKFtR_M96msj8e+^@y}epka1; zUSn>B2y((&$yNz8s5;EuuL1&VQNi#wm06K`zcP7WruS-kr8ix!CDSXt=`dxRSssMrYsnR*e}o z5M6Wwki+ahNpF`3?`X#p-bK;_i@EnjP$INQCDjRlR?V6>$yiQfEQcvG70+3m5pfgg zMzC%X#S-B+kVa>NyK2nbfut@lw-*VcgK%dQFt<+y1RiZ#!hG5Y4sGGw;7#T=nxwir zY4E**iAX$li1U!pafE)PvDx-)TXso26!;3m-7*)H2=^dq-OT-g3J6b2wwJ&+8;btX zi0bA^x9WA%{PZAn)mWT-9tP_%Bn0Mhz>}J_#^ZtNmdlhyn1Q6VGdEiWgh9zx3G}Dv zA&sbRo^*S?Zt^hcmXq!ZubU2yC9vCrga{L^M;ez6WuM62zo#8ZDEB70=Da8jH1jSGFJy!Hc0b4axX3k-y5(7Aw9n^1il|z<b| z6%e#ooH+SL%dH|U5%x-U1!13Z2?v!+U^T_|CJVV)ph8}wkvpYiPOy?`EbIZ7N}N6J z0X~R?srmpwYm6P-57q!ueGK`o$TTFxiojPyiq7!`l!Hi6An=`&;R+9nLQZ&Fvb_Y; zP5$x?n7N`*BJib`qA@DW5rv#!3dsWBubC_gCBnr>O_(Ez)09o1nWABqn$}`I66bNDMRac_ggh38#d;eKMXgZ+T7Ggx8gQ3z1d3^}ZP!n~mN- zCTkOew1WC*M74)i4eiHFTUFv}d+sN*mS09f4-xpbOtJ0r!0AGw`^4Qy?sRxH$VI{` z5mXvydlu+MVqszr5{6g_pqg=r-2m1`k;XaX)P$_%he&XZFioWK$RX=BB$_6kMuO?L z0je2IH=*E!qG=9|ebP-O0*7g_)o01kkxdvU*_^;JU)1HBObev;5`ix-xru?&4q@d4 zmBv=Q0&8!G@e&~mWdY5SEfHoZmq2U9+LMLcEKmW19;!`JGACHcbTo_ycY-KXanCN) z5~Fq+?!2p>O@s6@QH*`VadMZ&l)#s#if$!^+$*Ho@B9>sA+i66d?&~qH9JA>Lc%V> zmut-IMxyR*K)z>$QDH||6=WZh=rXekiMlrc`Hqs)5)=r0VWz0SS8nF10)hHP1-`HI zw@9!+xLkCr1Qspo^1Yv$>JpAiwwFLFMP0tjv{_vz@b#sl0$(n=MJ$vEv|Uu-n@f{a zfzT=0DuM4U6?Lb9^EsrJY-rTIqgsA^QCu-lG9L+Z*x?H><5{O4gF}C<{t=p>f@z7s zdW+UiLE-;JYRPugS*PSZqx>k?swWP1tMBgvH(GYqqvZ&Rt9rPhda1!1jZbApyhvoKg%Q<y`sbkOrfuIJPO;dr#b++VAJ@JF~EYodU;bt)ii zhyvy|semvL1w%YBFCwbWs`@36d6rp&JIgzm_}xuc(5qN6*PO%}!H07yxVn;Vyw>>Os$73MGaoD0eDZM^mHp~RV_T_F8J`c7 zKbK9c5n}1u*tkF4B_kEm@taJ?$R^f5?b^=S=wi>r#*DyD&5n`adz$Ycp(et6NE%+| zPW-G02+t#_fVr1cKzKO{n0s3VgfmgV+(f(&hdKz8k&0cIoG5!I$~8K%Mog9o=0v$B zIWbvob|%xN8%@52gky+c?W%~$V`8#GFq0KAc~S)gYgeVl+#4z&Si34U=J3!E>mXRW z(*4a>QS)o!M4aPN7sSpg#^Rh^e$H`z&d!fJ6{EASZ;VrR@+=OH#EM0pLUWEulS+hV zk<@?YPN{(KViYjw8yvE$aDj+~5sX1y%d z)ku7rfJRE17E$OW3?kt| zbfZ|L8F#{d0je({xqXrsL2AeK(n}gc0hZGy#a*v7w9a>4abvaEk!I45V82lEeA9Jf zF0np#k3N=Kl79{6yK}qjI*H$RxKnzjMA(O4+PU&;f)sNLq}! z+f+cH`C`woWRn=n2^R*1yvE!{6%edsno94BCCk*kNp$0JVIDPQgPFNB8V5#+9<60j z2#7Sy%aeY0AF3Pt9;6TM9M}F42Oht}G5)6|FoXq?tr9wvOIRdTRSBJvEfJO=6=QV~ zbk#!dl346xIBe4JIrmsOr|v&oVZ>mb)3hsjPTh}FAucJ{UulH8xxOekXWhkqPwMgT zZa6aI;CHu#QrQul9Lck&F3&HRnXzo(7t{W$Yhppq^xZM?bJ<*!ZTsRy`u~D!r(ZGw z&;RYde8#Bk!k>z3H&-GViOwX}2t$=0@wi_WvL(W!NN{XajTwIAq8Ql^(mp&)`yp@+ zAvI-Rj_w*y9vw694BdDv*83AsmEn8H+WE=Iy3 z-3FMU*_i<9xLziawjoCJQ-a(3i>+82ZekhJa0J*ol%zcl0G zlZxfOSYBhXe<{Usf)~jsRDAfp5xA?hcD2 zbwe}`d6SOdhcjuKj@7uO=TsP>t_BsjW;CwrzmutW=d!U^h2uWXJ=9I7vDDglo^o>p zb<^ft(v7DNcf?UQT|b*{Q}#QSjR;x8G0SJDEw(Q=o{H*Z_Ylu zBm3;{WMe=3JI!N18;5J-(sAVTYfJrllo56!X*8MRrSCj;&c>Q2}AfGjhj zt<%WA5Z#=hx+}bHI&!J|C=%O6Jc0zb34blw@{54ClzSF{4_-i_Oc*cO5`j**g%_>T z1jiTgO(Y!T1QsMa8Hm$2Kc#gF3H1~B^(r^OD1BO_Ie}6(J2mA=aKA4K6~YTh+_JF0 zBcT7Sh~pgfSR1x8kx(IlHTVj_Ix5nfpwj3p3;a-|rMCbpq-<#o;2WB~1#p*U?*;s^ zX3ZN~)Z#gdUn0_+#kXjd#rJ8J#lNdrE6#ZLNz6-x?@M+i;fF{%9GH7m1SJAL##S6B z$w*Ek$3?eFFe7;_8Odqn4J3^^b2RA!b{R+-8lT~JTBi+Wms~o(X5Nj*lil6Zz9GEt zLx;6|LU>q^R{*wZ)_Q{9zIzi1Q6`*0QXeEIx}|0ST`4-pl1HRuPA~;Gfr9&nD3l3i zx?E$fNlcdsRx+*WX!@j-tPoy98l4TD$e1xRxMd3JJrgnWK2mG8BfDbyj_l$&(>Y_5 z$g>L4Lhu;4{}BmcBGA&rR4_~y{ZJnAwl?sT5H5#NEwgS`DcyR)PB+By3}b5 z*4*KDEFVC^*dRQJr0y_xTm=Ny@2*|s^OwTPZv$AdyvE$qDjA)Kx7{a3NFa}*ymLuEfMA;X)u`U zRsn&Y)D>GUteik;u?zTd(F;YPM3@>BN;T%DtAN1zon3yb^lc>c4dD!uy2D(i#RxR- zigCF(UKW%k0`PR&jQTVG6c1BJ&PX`?)7g1 zmWZViL5;>ou1>)c4b#u$$#v!l*~yjb9!4vUBav-xQG6THxNP<}voBvXy>=GFMN(mz zFdeA{%Rd#8x*TZ|=r3T7zvR-rlgFxv>`tU;h{RH)RGL(`S1~8b=%NkMTYY_K%?2d& z7Q1M#WcwZi9MSA6vA5#NeFcgRB7Fj0bx#|DSD3F@n&Bxht-@}s(EE@u<_N2hbj&fg zK?Q_;l8t*Lmw=q9Qo<}GEymncDj?9j8;rE_2P!2zqEf;klHzXaIx5{651pi_cPvyv1y{%%QAhMwW`*D>__6rAl@b73gK>He|yFxbBTHw0cqC#@Z4YimxsqYNG zpXip7Ud6Fp)@zty7hTsGKUprnXFcN=WrikPj#TW$CMZlmVgrcOaNbhf8pOo=kT9h_ z4tN4dzrk=(jrq%@WSqE~!NMo1y|IZP=Lsuza$?1Ti517-WE8qk3P!EVKwe&C%?G(e zSiOX=AT?!Q=hv#_kK%3-$J!GsR@DQITSP04sKko3Csr(2Mxhl_FpjW|AP0)9T_7J4 zRy0pm2&=i8w4(W2p>>-Sj85D$yx9#R6DykkJ_MzMFDetDj-}R1Jrc%;X|sitgh)FaIhdmia&!kZWMNHgM1S>lntQg{oZ9%*(!lY8KibPv*KES;kw z8SIb(lZ*|@OeV=-4?#0A$+%USyQ57q*k#a6Ofv36;#+B>qAEGsot{h1qd~VR>XM^9 zJU&ZYa-Ipg%~97T3Ez+Iq~h6)R2%VJ@kZiCypL2Q&IgSwHsXDxTH+Mb$YLWNPH4t9 z^ikw*FI7 z9rfQqns3H_I0~41Tm^(|wv}LR0uoFS zu8#udHmHEWA2KQqjybTi6N!x^-hu=xgj)lfxLetT=L4H~QrU!4flYi-*@T&>k+zAm zkYJlIC$Ncgl})%Ku!(z>P1qOM#JiMDcr>tyk0I$n&D?WAVtwNxYAhE^W4S0A%f-)F z{E@CFkkAsslSmp;=Dx22LhCP?fVqp1P=c@_3Ygob0>Y6fVD32;5I9nb-S!|Vcm;`} zCH@cz<_WI_Ht}_36XwAVwTV}$X~NZkOclSFKw4}EkBmigWUvtWC0ixjq+G(FatYg%OW3Jg z!Y#@r>{c$}HsuobDwnWNxrBR^OSn(Dga?#MIG|j@!^$N*qFlmr$|W3EF5v`{Hj}wi zBB&D1Mu7!}?SBIay+Y9T_YyWrv7Df_^b%+gy2);@x0^ciIE-~em-{h9T4c8o9}9dU zZIVxXA@GUx)b%6Hv45ya>{BtVZ3%4Rpt1=!2R3o1vI(~aHc`8(M7SfciP~2s!rg&Q z)Xpjq?hkCD_Ew4TP+$|ayGn#d1Dp6H5}L)^U6L6VB_l=eoFeM#Kvl;#AEV3 zNSdTTh0u)DllPC4vsJp}47T6}dPUXNCV+1lCYLVY;??c2Zps&o>{$!!_cs48KMkk$ZJR-NxK6 zH`Hy+UC>as0k^Q9Y7J}1L>s=+&}swjm<(^!er8y}T#SnY%PKxUg~8o}v5F62@4VFA zk=4Mt22ww08tg%SGTWX_zz-UI`65Iyz5C)caeK>Z!kT>>qx~7L81F=RMJrLPJ*v8R znx_)zlB_xiL5#=cIRL@nqb@v6qf^ zoO3E9*W)7!#al)V<_Om##ba+oL8|3^J1&)sv%!b#tyD5bkR{VYt?o!D3aq4mr_kq} zJicGp_+7)_iHkMJV?LEn7k}=-k>YV3Z(&=h5raIUpg~Eeo20RC++mcYZfO7H=7@&X z`y=a|3JqK8+Tx9UunVJZbxz&l_>6}oujyu7 z!Nq)ua5<8iVs54i2(zMqxpoy0`1{|*%4za_B-TirAj%cOg-B!*S*nXrL-!icyySB)I;&`WEE*W z!=I&oP%RK>u;>F7?iYoeU<%2?ZQy>O1qu%!@zJWm?4la;G~)t!2gv(`RVJu3PP})5 zb+F%24Hhj>p+yvOf+?htc1{cY5&M^s;3R?iZqE22$k$Z*2H-8to&l(0 zJVKrTYh*K&9!BCMNIZe$R<31`Hwddl*omagWNw!V2=uks{*PX=3R`Q%bcJve65rL( zUl(A#yH!ZoTM*hL_wFyl8&N6|E=N-5n46^n0(~rc{n1OlhdL*V=?dW@q~ta0ov%Vd zXF+IQpMZt8kkH?RGf3(jbML5tAUn4`K|iBb1?VU-DHEM2#J zbT>}I-U~<^OGK?X4#c~^gnK|pXdmG)QZe{ccu*8_f+?g!h6?wKLWN)oX)R8LCy}_! zCQ_p*`*n+Ob|2^ubb$(wAR%CcLrD01?XDU#H0A>N0LaIM71!2e(Q^iXsN%RJ+Bpw< z$VdnP;W;D?0CR(4szhKbijiT-XOK`m!Aj;e=B7%?oG>Gl%xlbTQ~}}EC}55ixR%iR zQ)0bLFzaQp-YmLhf>|$%^|dM>nDugvx!o!tSWD9Ax&;+{v>5C{$vef%3gI54bb!(4 zOzN%BOS<8fa_qUuS4rRrQ;{^j%=KcVqDKgQNGf2C2Lc2(c#@Ia8_8=lvIPkdCES8U zBlu7na@}GiCzK>xAy`FuEmaiPWvu9ZX+W7^-j=1Jo1~&L!73_CMX#xV(2g4DLAl0U zk5pSGShZ!T_8t`wP9SLsYwgn?N65YhBgdpARl-T6)Mac}w>Vv8OU`Jv37*hvccvQz zd55s#gXQL>>mKd527<(j5!UWGA3@TMSX8xgu~T`a~}92ZW|*Z1ccK_ z>Jf81qFrpLdjbg~lwi8}STd-KMK>p0g`}}zPL0H%JqX4)f)*dT3bGBSc7DV$H&$Lm?Qn3{l=&XR_g2z^NE zFLPT|Kwx(j8^V&EqL34;B&H8gdsINMlIfJ$3N9-{j0je;BqdoH1OzLY78Mi0og)er zmfELTi^iK*V!{Lj4 zFW?alB!q#m2&ou)DqJNBIl&ZCgwJVVB8trr3njwkNLmGRGgUyKp<>-Ec_EVQPy`L< z`|ER20Brb97>lIknQKu2fo6(^S@I1eOb7&1NR6Vx+eoaLNDWtWC&(UQl?W#hS4`N1 zQ%G7Da~vgZCND$x7!s`#Uq-^K=!B`zB%7$_`jUb8vU(MoAGR{;_94+KaR3QTcnQD? zt+GCGv2s0Nzh-Sb9!9&LM?!cBFCuBnn0rkH1nGvtdYmQyMig>_mCS3*QQa-R4uO19 zSS13B7W?V|IFG0Tf%-*-C$Mkzoa|kd2*;6BfjO2&1FTKdeF_N<5KI?83k7P4=;nm3 zPzydNgWOkCKC`AEtWfc&rQNY{^6%hKOfVt~cKv)$8%-x^@!kQ>xZmkLk z{ZYW&1{DxCMgem-ser(^FiL62r_hvrXvz|rlM=Hs!Ahnzt*N_S=2Si>2b#kcr*2(v;n7+=%`iEMvNJDvHFLCymADxL*=O>fKD1qPQ4dQ}Bgc$R}V2 z@b5pj9qH45pPq?z3Rd2+T%*p1TlCA798usZGB-wOhG#ccjbq5G76wt&Xv`g<+=pPB zL(Xnu#cp$>xIQ59vb`usMx5*M3oO)4bB6nU`=THjaSOqC`9j?^eYiuWC`d-)wSt=~ zsGD{^Ot%=g7={tp=P2bylQ&?c8b&@wHEG2V@K+upVRAf4vuOB}G_LBpHm4QphypY1 z9IOj+>O#}?4Rn={z&?*srs@v6F^EIy(qR*m8>^{M9E9={8OAsC?itT{@3IY~96>3X zrhxnQuaAz?ym6hSVzHSE@l`7%C=fc4iV8Epxm*6K1vy@BdP%dGGatVFPCG;zo zuv58&Ta-)qb>$LvE0=JaatUlkL%(zLo6XK^bp0)9MNVLiDqwD#7|97VuL9=OdK~tQ z%8O#8Owa&Td_`rc=pE6i5EvZVE7ww(Di$UcFjDPESbPx7wQ`NQ4I(HL=!}-IQSd@= z0$&!IQZqO3<+~~31-nQj)>k4iH$-BNh{SqKB-Uplv0f92^_xh{lUq@jc2Jz=`{3M7 z5{MFEK(bZBUgZ+*Q7++sQ!e44atVK;T*4vc5{@XB@O|YHexO{!G364TRW9K<<(kv< za8Ot|frho~nR`kF1X@u6b7~}x2^#4~!jwwbCD{srjne)~&8x6^R#Cae+@nY+OrYsv z53d1-(ZlW0lT9^?BObi~H30tJC}U1*q|9p6au!o9cMzJ4r^+m{Dznf$134S(rrHeT zcx4gTZg=2O`blBs1WGkzW^o=kSBXMt5uj7E-GCm=t^lafID}5)$%g-`Pd5-)2aTrl zL{iATLOP?qjAH*@EfC&BQVYzzr2+yC6-}p-xi6X5Sd!}Qg#HT1H;|gLD{4flAaYg* z*;a`UXb6pC6Y*Q0YT}hc$Z$po(!_IUlSgDkbzwwnEsfT*4rd zddl236%gn|u?e)NC39agudyW6T@#XS+3S{_Zd^2OK~b7;-NO|}m!7E!eMm)LOo3}9 zYJ5eME8RiaU4K$@g-GM!(9)H){4^3OBwQxhD&cA*t%$h=B4|)7XEADE1)3D&RF>?Q zlj4e`7+X%oX-I4Z@e;|;t`X@Duak+hkkBN;m69zJXb@bp>z9p_A#yEL&8i&-_aYpB zs39R7lx#tIzp!!wr3^`$3kJX$R0YBi67Hvtsxfn`5=}K`_A1d_V}_MNZEReHQhk>) z(>FwJ4op5y)Ph$$s6bP=bMN#MT0zClHD*G^V`3e&ceiS!Fx(lKRxuUsK|;l2ixsmt zwIzzogbK#R3eI+7&AeC!Hen)?j%Mb5Rt1EMqky^3sDN-u6j(Tu$=sXFYsqBpP3E;^ zGWRCa_~FsK1__5BVJ(t+$=oIt5ID|MV9unHxi6X5QpwzxOm!YbWPXH%Itizd)HHMd zSp|f5qJX*oq5=ZrP;`bS-w=hIU?y<`4wRbAy~(_mOy=HX@^UXq{;`-W5e_10oy`4n z6%Zbc0_Of)1%&TK0dxOK1q3=dI@WuH4s^ z+I6G@d*?`qKH(+FRtY~+F5#?l38ST!5}{49Rl=ppCCpGR;S0(o+@M^-Cgl=#DVOjq zt!gl){Kq{*Og1yqg=v0$|dYqF5wTAOL$1RgvXUjIILX4UnrMw zRJnxbl}k9KT*BWfm+-1`32!Tx@UC(R|4q4sW(j$faDik?go(-}Oj9mlx^fAhS1zGl zxrD2gOXyNAVVQCXRpk<{Q!asn#f=^I>NC=-IYFhd&z}VAB_ugkfSI<1Fj}%X`+q7D zHHbO@N`#q#P1F%kB2)vL*oTDiPZ$bp;!b4~?hS0>eq|G$2yEhEWfM*YHu03Q31E0_I*(0fF_afH|!w zUY*PV>sOF)t$7zf8&Z7@S@k|Dw!jS?J7o@-UlQlaX_S=H&?u+zP)>uOoO-^Ty1ShE zxSTq+oO-jIy0D!3t<27vCw`Yx50%+1yOm40U$QwH^{wae zc2=1^q|u5Om}AlEb|lUrL^dA>6M>ybcIwP{p}QYf0sm4j3J6b1wwLg%atSAuOL$qi zgfq$|ysKOSM~53M$$p;fS84y4l*tKdze;#XxdgReCA_0tg4&N={~%Z=kk~w;np#2l zVPF&ALP9WTiw3A|Q!=lEzNlitd?b#@QjNI|6%dw00drqf0by+vFt=U>gqxy(xy>pd z3`PNS+f_i=83oM!GZheaM*(x+Rsmse6fpN&Dj?h)1b7&hbj=LKU`s(DC7jyEqmP*DHy^Jr|xrHtt;( zxN$4Fk*N{Pj=)Y9=EPanKL+Ib*t1iyG&%bk_!)@{el-1x&qbrdImyOIRmXO^)?aun zuC0(pW1@}5jmapK~71z?jtDV^db4LNt0e9y!3Ty z(i?@B+Cq9zc(bEJq<12r?ygifIlF~B-hGYw*`+vzBk|?_)Fg6F3)fp9r|B#7Gu1_U zitv(8q%RX*@}2ZN;iWHTll}@4{B+SEXO(hY!GE#;os=SE2Y$z49|SWKJSA zWnYYudJXhxB)0xY_JLY?1rOYT|mU#`WXD zc*Tcn7Qte7ou{Pxq^9xNl;|lr{ehc?^t%`j?;~MCCNy``L4R-XO>o~<1p@Vp3M|r! z1Pg@8(E@WntpdW-D6k{)5^ye41;VU`3ZEB+oL~xRKBUc`6NM6i28+%mh1@G73+*V< zr4|U?(E@Y7ssh3dQNY~SRX`Yu0_J{01%$h!z}lPY%6(mVjdiV%k~zWZ%4^JRQ~}{8 zB(@K0C*-!MfM8DKwd6$Zok$Iy19jHklwBkB_JurA+goO>8v>ii$}m9_*eI5?CYiOd z+300i))p-qovh}xN)r&_fwDGf0?nDKnI!M`kuaVJ4@)*K?kT-bSUG`GjffRL2+p60 zLW%IaWUGWzNX5}X-N!{CCzwJC)_pzLR6&9-gab%wfw}LhfbdWhF!!(u2nVCU{4oHJRe>ASTiUC!PgzuCfTMt=Ix8 zd{Go~f+?gHB!#k9NG(VT6|az5&a;KZviGH#YZQX=d`()yX(s{#T?ThTF=yh#*t zf|bNY8>n3>AXv%d@fvWqi9&_IdhvwR(J|)0Se}nAJvxSl_NX3#Zit@wV|sRcw4!NK zw0Q(ZuIMrqenu2>f+-}=CW1Q^iLoSp8p#EV;){crNCQs%J{)XT7J;=D>!-pvQOF6V zkm}FCZ9!uF#7`i(3Mifs#6%kK;t&YOD%Nj-8u3EY6j;CIoi$^PAbtzYJA;H01PMoB zX+ed*7loW)3aS04!F?Br6%hX`lB=KMvq4Ox0Vh5M@>OLKSX;6ERQUfyAt#tZs-Ft4 zh(eiQ3TZZ=!poviA(%p%4PFBGbtJZc_#cp*ixj^Z#6%i!;$t9>D~rI|iY<5+oad2f zp7=LNt~|vr1Tm2YocJ)v?~WBXRZ5_8(Kr?UToiJGDWviBFt~?Ap+um5(E=6zR1|W8DI^Q` zg8K)eP$E#@dAJ7TMwJroQYnGuidD@7XTB(u2%VCx5|${J(5GAiZM)uR2T2XCS%}L- zoSUX!%1nc3x`<1J%aMw%w16{J6$sQHuJCD5$O)#9!g3m`xh7F45ooYzfeK?pAt#tZ zvhWHN-atYV2|q$=&c6Qi&Kh$pU9`6mQ|~Q0{SqE5&cu}7gv5bP+#}-39RSsgI}i_p z^{7ZogvXG^;>Dxw*(EjRA6L;6fWOeJ&B4@GX(dUc+3pf9Fp$t1!VO63KXYqUKp2by zv&)iIQOF6`Nw!QdBe+TdwMGOvVZCI_1hbdoIs@D}qEI4Sg`}P^ceM%#thX3qmTVV= zobUz7mI-DguQ4}Y1UX@$WXlAzmpnO%i2bbwk?=ZFvBIQ~dxd0S0_^q z`T+cm%YLL8`QPG?$vVcL{!DN*%cowQl>IMpNU}EVzll!&UFc5&y%T8h+3n=Czt_>U zKLh)m0Q_mZ=Q^75U5;k?-HxXGa2@@UYwvh;1nC*j8x`VZ#~+U$ivfI&q(#<$E*!aY?ew&CP|82-gd-=t= z`8zuML&!;UAwMdN=RWZCZ&LOrF`tgtgU%oN`&b=)xQ;$jM<1)BPdJ+GeNInv$W6-r zv_bu^JN^G1@_!GS$D563JP{uIU;4w*n2WPdf}ZR2=Q}y|7dV>!3_6c)_a8wo0}Y7%Ng5>n#%1FWo1Qv3X%RzC`z1$z z8v3N0!ME`-==z`fdvqCr+@x$yjD70wzB>QcIGXM4cQozob~NSt98LKFM^k>#(Ud>o zXvz=Q(MKFj{i8cs>I;X)mujc{7e((kGy2^-sSbm7fGTY4iW*LF0IB8|CUF z4HAFjvIUT@ualD&ahP8osGC0?aK~3K%G;kEU;FCfi}Q2%o0Q$qK>yx4{pTFb{ypVr z_TMXxru$*F(L(W5X> z{tEQP&i*S-PW@LMJsJA{4s@H-#|2qoebnseOQ1gnG_UmOKkZF)@>!5i0$rH@ot*mf z9DNn^zXY1sn--65C#QbN(bqsf2kq-$<>ad%|0-x-|86Izy*-ZJ3jNzbce?tIIyv=^ zIr`V3|5uM;v7X*78uP2~zQ1=lxg39vX8HY&ru?9zDL>?B$`3o5@~0h5dG=Gq_Fw5} z${(nsu|92MG0x`~!GF@+2eR|;(cJ8f&MtwRbc@J!Kj5UBPkyPv_4* zsiTkA(I@KY=N--VVSO9^CS_l2;LpiA{g)g~e_nAk?X^v@_Uru7?r6&A*U{Pd6whB_ z{h+a&k$B?TC2ImbD$p!X8h}4NpEf)CSD{ZD!!Y*85C@n1P0F@5Xy1Z5e>OUr?Hh13 z>p$dZ$`9AkCmc=vGj%k4YXcj9dVYG^`S+~`{=MtUv%dH0=&lP>yjkDi&m@}qLv{3t zI{K-pMg5l@O?$`Uw(g|tcN_RO<)T!c`t6SX|C_tkD7mUCeFI4(kU*lyV|XFN#vab2pbZg-cduBzOsYC1edZ~+4nTwxG}9|(*BK|x@F4-_y+ zBH#iQLFG9N3_36Z!V**j$N9eVsJrh;vu1uyt<_!kyL+E=_St9eefBx`QEb0UVA8h> zO#0OVlYXy*Z*6T8&-1=HMfzk<-g(J?>cz@MRES^0xS7HLZSJ={@)bi^;f~q{`H&~uP-Ao>#GS&{)WJ$ zCzXRY@d&i{RZ zDavkvS>KZalm48*q`xLG>2C{6`t~d`tS>opHQF=xbUlw~FEof52Ime`;AA-*JSdQs0M6QJ%k`Wy>!D{cpgZ z!U^l2E0#xe%FEZ^T7LHD4uMJM+iWGhyduJ+^BudEPRy4cOU$<e^VQpyPR#dPTTK3!@n&d?Nmp+_S10uN@%`+UPX4O}CO_Y#^LI2P=1)XeO#a=Uj4=86dk&UP{1*rFhi@dEKi?xUe?mxN{(6zb z{J|uN`4dbM^9P$G=I={MTyZdeCri?Aaxj1Y%+lH4M+H{>6`1tJC&l>}aR!3!O{SYVFFj$?Iej4zv~&|gyUkAR*6w);UG zU%t%8${T`ynnUO7e=ME+eA|)4I|cp%%HIO~Q;}cr-4vFe@}ATaVb+&)FyCWg`L9BK zbzph@cbA~w2>JuS52JvMmlr0Z@~odPZ?W~=4gO1kZG0ttx1c`=`X1meQy=MkHl*Mo-O?8HgFPS52fXA=u4X}ukA7E;G)3yqdYP7GtKP33^G`#&phurBMG6kPu}3F z>DvEzPpibdC01hIWGgZ67q*z=dxpU5KkpBg^c@0|&O4ATo%kjP^Im63zu&>Xbnq(z zQ=Y-~@$$U)Th{kQ2Y=xy(n}YvdK_~yi0^64OO?z92KxFUd9vK{Mk!&6_~^S25pkfBiW0=Q7~a4%GW^9|pb>_;B3cRtBB;YYzYIz?|P%;XK?g zcArE41@Jpd^z|Q>{~hq60=-@o?omdaG8U8x(<+JqlQkMTb@NFN)JGl(~%fQcKKg-HS$D8$k*Wup-{PY~150L&0@G+1FUyA0ShRxTGZi9N>)cN4ED-;BDCNvgH>6%l>pZI02VM zKj1**r^qKWa5A=cDDY=tAMJ(?-FWu^TYFgzEc>4Y{te`#|FHaLfNwY`!Xqq?{f)yg zV5Cm~H}}))9pWzn+xw5_0$%~V%lP|TtUtaAJZm35WuVL72>dSgKTbFJZeS_TV-Egz z;FZ|_!Ix_PO&r{S{Uxi<>9`hiJLF$z=!XJd+m5HCj6RkEBS+isRzpt!-|(TRe?IVU zFn%))y#_oF?b-1-AGpl?4jq_>{_Ft03ifEn`)1&2SdY=5sSn&c;VoH$R|lE;9t1uO z_HO0<8L;f{3&3B+_}KdX=+I|k;7-7L%wd=Azx)}POE z=obS&4tu2j7=L#FUjzFaGxA>zdxLGXvHf|-Pp`B^{t{|cNsFp4+(;@S-72mGn}4+L%=s_zFN|B=8CApU1e`3_)Ne~*KQ99#na z8`?{n^5;18D}i^ReUNb*%7?rgfM-Bn8&7Tn#;1+{=A!?1JLPu+Uw%~NkG}>^tu$K*q-?_S_rM10r{{3H0gtq=Da zc++5yHopH3_z}VHf${I6zjJ}5{Ko-54*UKu)Bn}LHS@d^?e8B+M|`yYk^#O3`4PvP z{&_m^p~xp}`z7F;#r*h1VA2e1hmAMOfZu`t+4esHya(~o%D(|v%IgCk+ZK)IR)>Be@TJIC zE-~_a1^5aP-);r&$9!+~_hYC0uN?e3@Y5JCEARWjHw%4{@EG=Uzi-+*5_shtJWgxy zGT>LC&xXOD2EIqwLm%)Bus0h|&LqFccPD|bLcD>Rl|5e!Tt)lTKke~);J4uK)<5oc z%I^V|_Vc(yf6>8jI(UC92;M`y=`-ye%>@FT2_NQ9OMu@(e7ECuGBBS%BMayI(}C9< z70n0Z!1uxbUIv}=e;%0oag?9=`Q@Y|pSJdJ74VIiPi%j`1$?ZS?;ZqhVmz&XKSMgk zf6UbX4)Cv_-`NK513?eM`qS#`P++O=1rGis@a?c~+y9e+I}v{tn)*KL@RxxDjPIum zeFFHSh_CYvzS80U7Vu{wkCpEs;1?lp*6=^+@W1Tfw}JDpuN8)WHm)to{u~Y54}V!} z=pT3JCjl=;{3f08JLAyL0Dkd+X#6S;{bJyi7_W?}|7zf$i}-o7!~X-|jiSF#IP~8E zFB0SX9&q=5QU7LO;*tG3+`)^0U&r-7K1WIW!dfQA-w#|vJks;kOm7JI9^_xv-trEA z6ZkyXtM$+GfG>i*oonVV+#BR2fNlBffj72C^Xd11*Fb-l7@cE$eLw|Z1 z_yO>@0aO0hfG@&)V(sbAPWidG7Tk$=YV8^K`o!w*0RB!oqOSn%$9!h(G3W4aA;$Pv z`X#_GVE$iW`g^Uz&uh`LKlcL9LI0CR{$B%M4*NUK;NJp24*x)yQT=-z_yG|Q{|-E3 zder~@q4s)VCG*7R(R$ zQu3UO16lqu;M-P2?OhMNN8|%H0UwY4ooLG64SWyymm2&K@HSj8KFsLvDd6CsNWXsq zo+H*j`yPdS7~@HQ;(U&KkGx|r9(H^e089B+0xuHdxzV9-0saH@Wy_xf{2BDu;xCg9 z{o3*Px>Nox2R{hhxfH)ZZu;{qa1-;-Crp3;)8YRs@HObK^^bkvn7_sRXvgnR;11Eh zg}}0ZUBH(@Kew9t*8;zVeA(uY{lIq$``HA%2k~gF;r|@4tnUH`U+3UEfoDNKU8ejl z;1@B!S$#cA{sqza;a)56J&u>r$9trk`H$l_`xsQ@&1mC)`uD-WD`!XRzY~BZ|0>`) z=+9>G)BjH<#`wZa6fOhLL;W_MoDDo}G3?K@|Ifg?;16I&do#T+0mB#Dc!K%*zXHFD z@>c(k0AGN7VgcxE?>};7ir_6b`Pye#An9Ujdf& zzwh8V$9mod(Z3UcYX^F5P=%TgR|CHVdqpu-e+F3AR|M{cyf$8b!J%L2;2VLLV1C22 zt?IiE_&&^+`y2d-!~d*;uxxKGu2nyd{-0^+#{x@wr-ReL(=Z=c|MKdMeAsB#{CZ=2`LdDK zD^^WTwpYFR4KGuz))Lj)wq(AMPghF%L~p5FK0OGl!}YqCu8fp$KJdxu%`bX|uu*R` zM@HHUp6{pn{N91?{*>R7T9;n$`#4ps`lIFQaK7vp8`ZGx=bMvWp*mhG2aTZEzGn5B zl~XhMY{$=sVSbw*R2tznZzRl*2Y#_RKEBPX4u38vG}_m6;kGm17Zjh;#flYbO`i=y zz(l^XE@MMNnte8?IJ$wF-@};Y@y8wb}406XOsi ztS?)>4BrF%9ta9SX(H&^)(G^8!7yK`k3%q?nJm;2jp{(KHJdMN380|P&Q5!BGF{1r z)zL7h*Li+<>wG4tj5fx2ZdvPGjurxi1U$XMYv3q^2;(q?QavbCD@7=^S!o2JH&h?) zEsa$BM?>mIz(g42AyY(G3L}om9MK1Ye34|?$B3H45P3tn9)EDs?}5cZpw6YsS9E$K zXg$#g%dLanFbEXLmTEyyv%Dp}J_a`o4SHj!I2lZo3PEqq_PV7u)Vpl8JuCG_!kQMr zD2^w)ynMYLgbnCu7^*K;t5lagOiea|O1)I2i3P2*8)`u%1~e7cfTA#2{CCH5eXgg2$Uo zAxv?qFJB&+;k&>vXMl!7&wxu=6xlX=Iw{gtC;36)(TWqHj(s|$EU_?jctRI z3=-;OD(i1(Ha3rh2{R8MXg34}A~b7yKoljeFI28&h@TD%g_yp|Wq-6*s=DWRi5NeHf=0Z4%Wm(B={~h{~IdQkg~pMux&LXdO4oVX##fPWo^uL=t*Ref8% z5scfJAM-wfdcH&x%qdEO(-JzZrbpGeVFXay9R^eOsW+Dx8Kv-AOm#Z9p;sWCK{zKc z?Ba|XXMvLlXq-T(D^;U{EgAgoGG=2**YSH}GhZ%^l!8#nW5%PxghU+|AtjFCu7lN~ zN~u7*Mh`F=VJTl;k62PdtKcYnqNB$7F+bimQYr`awuO^js}^0k3^7f@2`Ea~Zt(NN@!=*|`dwWN@G~6*-DDeCeQ+!E~A1-yQ0(&P< zPpl4>jCYLGn)sVoxujlOQtVvSfn2JDJna94AQcGW$Fr#-PSnDH>S|?JJSR@nnKtaj zrq2!xCNPBPyq_M}sI#unLkLi#tkNx=AEY)9rk6>c?raZcmwI6^k2vQIru)16L_#tQ z0Afh9iOea>l>H(B*y?qw3As04D%0cox-&i_5`qu>1a4CoT9FA6COuufoqUi9$K|Wm zk=#X{>Wn(2oFkL*jjvewqNzL*(uAA@^2xgKXXvie(H(18zbTzybjpT^5~apAC5#U7 z8D_h!R@ABhx*H8z%_RG~m-)E{QoZq&QUw^;!F(NM^I@?!-z+y;N=Av!sY>|$r3%hN z!G5lEcEETvSOTzvliie*4fKF9i8Kpxx6-SYq=-c=2?x9Tvwlwf7lzk^G)q~YUoT-) z@~WuOc^?c(nNT*U6my$e60Gk}w~l>GLI|-~n-sl7_xff2z~)XV9<6w}JYh#J*Q_J& zD|%LbB?Lwk{V)+2ky;J763HFtU?Li89V&B;A_5_De(f5A1MB?6hJK%8{eecAsuXKg z&bl1h{yLH#8+ai}x~|+KmDTlAHs#jJdWN#9=B0aeP4i&!h``FUnuXzQ>hxwL>+#i! z@h=~%z)1v*I@gwoS~DGPMfa4So8l@Zg|8~NH;u>inqHPz?xzMEd8kfkMXmL;Bo)@W zPAx?-7wE1H1fwNPhoSNj4;?iIFqDIbM@}afUPf>guMl&Fkn}SV>%qz{HglU11b3Ae_Wic4tRF;Elq%-!Q;)#k%9xZL};oua< zCZK;N^w82WKefrxQqo7Q>3S6lqI3nz3biWd3M>=kCxT4%tZenHAneDK*@qn16P_Cj z(6Ikb*#F)_BpT%$T}aE&n;nwvv)9R>oZqI$0v$~^M%YuU4uonOAvKH5J_aWB`Y+oE zJ*u!T=bw5CY(u!W(p@$ma=ndg64i3{_UQF0EH%$!Y*9|m=FkIUe zIyLF*9NhLp$9inqaB*&RX?+}Sw8~F*$EHu334BGx0Lu^EGa#vHQu%$)z$tY6HL`n3 zOjRtIKxh=|HxV&r5v)3QT5d3%IK}3dY#GfAHp5Cj#CAeat$=Mu()Gc~ex$kxqZE&pfH?O7!3@L{W$4Y}VR68lfVg*#HT-%SuyIccXS-y{~tsrt4-4-ku`fQXc z&0t`%rA@A2xOmTX$1@eHJ)sHP89M-&{L`F{xfWKT0g+~vR2{r8#iiw5-lt^q)=%h! z$u?!GYRz^^9jbfa{NDl;hgXGp2oY11m6|(Pb__f}V3g*VaihiATk`bz< zuXJuhEX1^=HIXA`*|q^h=^zZ7wMJdmlU^T1s#Y~j$YR-tvXkB%Wx-Tr7b=*J)Lwu# zYhffYJJq3qxsYmC=@O2tHkCwz5KRwoi`YbKhXzA#qV>k1?j#&o4l|i_ie=XEEqgN= zD1>C-HkHB4Z9%vsFHQq)OWj!s!mbg>P zA&zNTM@+;8#7m4o%zQaa!UsX_@=XBijD_7uy9`5^oqMtBVIJBSo5lIs~}Jp z=HR#F(e0m_FEx6rVJ2U1VAMmkkL6{8qS?0+sb1s`FpWeirZwgjoh$v$m~(K@7%#PB zSuq&IZT8cRnNjFo#iL}kqE}$NV+iOJliYe?NRlNZjJ&w4f%k!OfDc?AC5U)AVBP!hb$^%8yBuz!ish za)7cXaw<2{neE;=TP&^_U2w40_;E>$<45rr^NmVnmA!E}?q*FYtr4nVS7D5(K_}9w z!M?r9C~2?}M74pJX_c4DCeyvh2&LLM@zKr^Mb>508xWeM*~5@wL(GrifhNj|4JnnV zK|QJnhC1fNdR3j1~aC5aTDo3+Je0ntMmFjWQv)BbKU9a>zcAGf&N zrbJ5^>LyDaViPV5wkE5Tj(Jtf7mZ>u{VTV__avxqq8Bro%|!i!!>C}-1k z4@@%NsdczMtNc$*q%^fyB(}w5gk;TX>r{`J+FDeH1MAmG)sxMv_@cF$y7t%VkD6Ch zeXx*3GYqk@Zl^EI=t~t{tuQf5LoLp=5nLP?oa7#?US6iuI#5+kd6c=@4xoM<+CWBQ zkNbieNj)FM2U1uTX3M=wL8ZtR>VaKRi=>jvBkE0#1lEAwsi!7mdVPP>B9l5DS=v@ z!TQ}egNk9}VxuA!fQ>d?-9uJros)%aALG^JbsDi9Wl2%cQ{412B`uS_*fx@nWue;B zi}D^oY%{CrPY$JuB#tX7m7#-(7)=BP?(Ji5(e?2t5u|f5_$gWZpx7FDwY0^adT-7q zt7Z=zz1DMWY@0i}W}tF$aHNskMHv*;pmTwt3ODqX`!H(_X4rvAuRU5&Y-X~( z(o3v(f7JRZW)-7;ZKSeEB|GM-g<1A1yVe^I15%N2Q@I4%jyuCVJ0e7qc&0XfVOt*5G+uZ*rB=85DsRV#MLT|&!Ho;641u1)IVsvtN1TXd!q(AM@K;t4 zt54=#G4b^RBQ|Wk{jtPObsyH*id^Ojut{_EX__^sVjEKIngSQ(Gg%b{gzP$A#oD9| zsGT!&`H&c1Pb)T;$*jX8ZMH2d$&`mhyODNXVl6EeOj#=?5?+;55sd5l*jR|!J*Hh0 zRAUqcBF}5DZyRsqhwk=KY+Peq(+w%>C#9>@52S<^YGq6j5%dF-&KRg@;6D@>n6Zw&aafEBu zfu%rRuf0$mAID5<NCEI>%Xtw;ao4{mS8U2v^i=y6-qH2&U7>thf3$TyGq+!^Tm zJvF1#pEuW;kL9})Sn|#Nhw0uSyvfykEbTsE9@{=H_{ntd zd%oq;G}0e-_?|yuhIeknrs^QydDjnoO3q#PhrK3xTmX`J`Uf`>&%R4%ruU@*P@@vss(^;t3Yw z9#4a#Z5LxMO6Sd)OxIi0n%rh}nkvHeHX%nig{}B)!<0pM#(W)}bk{b`Z}$)NZ}12G zO4L1&S))9*rH_xjCyBXv2QS;#k~S*;KzfZcmd@0pKD8;vJJ`__RqfL%oBK|jQv32U z*||sBhxgupq9nv8Y-)L_D|GW``zjjN#aIV-u@2_awzYi~UBh;2o9 z`}x?puAj!nxNOg=F>Q?f*cior>|8#xv$rAM-4bWTME=Hl~zM$kjZxkHBzb9;xEt_BU^JiFr6`H^5owdVz{Q5e+aifoifm4UN$+^S8Oy5D4O`ALo zy%F+9Z;f|*;(D8-l|}n{*bYiH0+f1@(og$Yw5^v%&x^6>u^v;6>NQn21z7ZGPgOA9 zZH+%MB@zk6)ik(b=4Hn8Yh{iXhqez$+_u+1%O)baL)wu)AhpB19y z$9>Ua9zEm$i*E1Nj#eT2N!9!3KkGYwfVlO{RBf%A6LeNR?)!S5Qj=Vj^}~v`xT~VA z80D+CzJ5Yi=k8F0kNJ|q-k6pOSc_#T47mr5zDt25ED=dB7m(G z_b1nE@abXAZ>@REXAZ}^-;cX?utH0RWjgE7rjPWy{PFJQxZdpYSG2LhzKE`(oI_04 zICGIVX1@(BA>aQ=Y-NZa(RDTW(y{oZ_HcP{!(>x#3yV!Dy|19EHG;8@^N4O`; z@ZQrKVV)T32pfpU8(M!NS|s!Ergc8k0e;TtX3H4uAUj9tVCO*VoXj1ieluz;^C(S< z$JE48FL^ZH`cf1i@*5s~zt6FQO7S@2@TjHl^T^C-yj-bv2Iy&+!gf-= z34?~#nqe8!3v;&k_(5=OndlKT_}ViNFU|@VXY-19_X*G$VOx#IYpZSox+VTHe}UgR zHQv1_-q2=n7I0UCBOCO@Br{#ng>LS_k@AX^I=Yo_u?OYj)=kjjEhHSAMc zABnb3-?52rUE;eX@%=jSy%lv&-$9nBeX0JQ2xFF-kLsOKSE@P8J>|_>&DBfQ2I0G> zJ3^?lsm$wWMQd5aqI+ZPm{qfMa8KP17JaRcMR&#S@|pLm!bT|dcsuhPi=ej=an@~{ z*;$J|mFgaP)FzwT^pLs9(qx)WJ*pCY=9DK`8Re=cAo@kbX=pX0HhD*C2a2hj@$Q%7eB4tl&$ev#b?t9xTP4PbqME$MS9cTwum6hkVjgz+ z8`=tLavS-Ck6JD*=|)|@AvUZgE5O|OH8~C3osIY3Ba~V;X_aSA&8mub-yYZeyx5A? zI4_otQdnHR!IyoI720d^8a|Aq*5owO7?;yvMI6x!7rq;@PNSB(w4b>(*fb-gq+w@- z6}F*`&M+~T4bLn*m*KJF!AMz?6KI&?=wKaGX5Dd9jj4J8JlhyB6=VlggreWuN#Q$d zR5lNBH2C7|3|*>*)oN#ums5+Ra0(+E-^6)MR#0ynrX2!I_;M%hOR#&-5%}?y7d?Krg>wRqm>dK4;ht`cQC4 z!-7@3Y{AMyL0)z!aCLB_Pd{j`*8Q{RD^=|Qj?n=2(AVR;^EW6{@=0&yex)X>G2ZRE2;X7#_Tkb@f4LulT)I%(-25ouOE6s)nlxg5wV<Eb)H2cvm()G3n9>iHnHLE+KoFf#uLX5q_&c zfkt!epAq!nqRfo;JG^GU@cpyie6-5VJMz&guQ=T*MSDZ5yacV1yN967F!7E?GDJ&E z6D{!)(GoGwDf}Xm@^9MR!AO#5cQ5oA?an0H-TSD^l(*6(=8EdfH5T7v_?BV>$Po1? zFRs62@_UQfL2nT&G<7^4v$)W%FQ>8ZX`lU|{g{PYh30z$y!e~&%+4*#b>#Ar*w>L~ zTeRvm1*WN5^k*@3TWO*`&IkU4w}Gh!q~~GOF7T&9uQ+yhi!ncXs^vMKZQs~yl7;O$ z*zSbw?ZUPL2&&Nw<6e*A=LH<`u8TFakv%F`vaMqtXX!Z=p>KDLN-CMKDq&&j$p`vr z#L&e!q;~b*vcY#^KXWTU7Gb^r045c{VH}=`c+gXz_h37Tr(R=_)>{d~L7N}+qum8C zK8Uy!4{gznz6myu#N*w+7wv-VQvdUIFN?kuL*LsU@BZB>7PW(pK!f~!7W6Mri-*z| zGMba7_Qt!Nz2@n(5`n!_Ones&DELzSWHhIyQ5&U^h1zp_FE4h4i5mh=@8`wof=dIp z2Uuo=6Jxd;b)^Ai>Y%!Ns^`lHb0;MvW=Kx-d>&EUri6rQ?~$HQkw-7`L1|K6>IQVo zYpGvL5qKnF9+TTRx0(8Ur6d_+!#h0{ZF^hbNAI!7*DW+p+;Zxh1T}BqpRh-^EJEKD zR!dA_j>n5W^HMxCrt0+lU+NHsclVr`0}!9uYhdfZm&TI?4GmL5$b(ul;6BulwOny; ziB%yDlF|Clz!&A_`MiO9o{CkKI@&1AToZ>rbLT9-s`0Aj84#BQHKFGVZd}Y0A#5k5rMHfStrvu?idKC(`GVEj z@+HgT-SzP&mVddtXvLBh7U3O@0ThS&(g)%x(|J)*1L-?Fp5@F_hZwUEBi?;&yaVrr z@m(h@E*D}yy+Rl9V<#xgdTfzUH5d_(Ku@ZeQBRwL$BQt&0~m7Q@2LuyC|tQRB0)@a*C` zSa|xhg$rSU@({xsX((1n=8hql>*rN{ftphgAM3wt7#rEuJ~6;uF|-K-kI(Wa1)o?J z@BT9G68S{mlPIl0JWPIj&1PtX2bShd8b)`*s@GTZj4f{Xd}!!2fmw^ z<^ctHN%=TUl$B9VwT-iP#Jm6A```|Wa|m$=hd<-{WS*sF1JZoIx45~sQLAoRmR!}e z*s%T9Y1?}1q@bbqT5oBy=`72-@S+**%BTnN?w4Zfx55qiJwV0>EyheWsACNq7vCAH zbWu&-*g!ShzyLcHjmgbohDxnS)D!CMNOzFOeg?)_Ej+$Dy^)W~5WVEVfwG#WSY;_M zSr9(2=B1u02OD|(uUUTX2|=os#=BpOABpUpFuufp;FGV^X!+#HzR8m>J%8eblmCZ* zg~M_SpfY0es4=ke_Q1Q5c=s0rZ{vOYz?*nG;;-XMlWH-7po`yhyFf982v%C$9VUrz3AhD8+@tzvBGJ*VF!07qi+nk ztu-5K;i8<{yxIk|3u`ylZmw0Mf9-YoMPFY*x*B@htj3w0KfL9ozUT>CwIjH# z??e=N=nL*h9nBAN7j)ePepoDJ(LeT@YVrc;+b~}w8=U%XJQ{slRpkAdUh28_$JM9` zis}^g>GAG{UXy=2*6B(ZbLz%C%=xeH_2%B?>pehigzUioVix^ni1Z(fxk~ppyMxZ4 zC#tB<0Qw!o_XHON)1ykNBOLFZirCiTu7h<;D?3?v-6E6cF2tc(EZR`~(@0Lx7v)M0 zVwRtd$y4p^@$QoEjp_a|A9Zm!C+Lob5VP*byktVy@WBfowt&Ad!MnhJ4*mkcS4JJ+ zJ*#=i_(Zr4z7BkOg4e(o1h)h~3py*^_0Gyg^aS}u&dT>{nJch}3-2r1$ZJY_SA^27 zj8eL9Bxp+WO+kA^dT%A8VS7M;JyJ=B}<+qQe#LV!g`o{joe>xKi`(#`nGYmv)rFhRsL3%{RUN z{oqg6O+I3tJat@UY}~9F^*;;R)>R!bS4|zS9^IoZ47^v*OY+0_)w7bab`NI9TAAv7 z6Yu2u`(B}0YlhDSOBqV?QeJXiIJbIVjFow?LVW{Y)QndfreuorGAfPqQvM~q`|mkB zy}c2uNX1!6sk|34PYuU1%AA$E@cu(Yg{{1FD{SSt--*y3Vnr*VC9nz;R!m@3(Wdzo z^ir-;MbtzNbmQI0Jya8~4mzW#PpFA%&-c|tD%py*hV8KJH3gp!@`+!x@X_Y8O9MF@ z679J5>hPWue2FsVk^{W(Id5Lzz91{Pq+JW91m6o*9`RpcI+ms8^24*#psgOXSv_iY zE(|39h?krn)`IP~H{G7ARUYAWvv0@SlXiP@<+*%Z)tj;V$MWC@jZKXds@2VF#M_hJ z=&T%D^?GdGSS6S>ehi;`73~Ggoy}aoi-^3dR8N{CTJSQY{g(QEu)LDeJfClw{aQo~ zQrcGqCv}FFUxj)qVxTf}*M`WM8fWYqsliRbd(2~xs45Q+jvJ){jekX=6iBdf*2|$dBb}g?#i?T2#{>4zSTTw4aeJwr2zexiMGmIpH;Z2)?N5#-J&hY8p~& z(0fi;iXH(yx@vK-&^E7D3tD+b)d#VcC*?J0L4$hpgr#ud*<97;(_CT7#|iq?NqNhS z7_UweG0x_yHiL6l?Tfuyke+gAdCv|dxF4<8rS1Hl-Xg`BoC^DFn z(N}$;&kH;hL4B*I_)hc=%duBvp7vhQ)7ep%tL565!a6$wYNb-0Q~7QHsA0dDv0hW@ z_Kcd3g1b*Bp54bRnl`$4r&gGsZyw`3s7~NTre3X+Pb~00<~8-IC-?-XH@lJ*TRuwS zds{3u+4BVco+H@nNo6EcA?u6?+h4Gb45Yy;wjB$tw(c|6%nw8h%++gS9tU%62w2>- zt0Kx*?43{?$9C&9TYX`tccrb?R$n#vjdIOas{|?oJ5S7fz}V5im^BgOW=&4LyVJWO zr#7eFhh1p#rT)8?3tcg`{fl1cY`qZK9MrR%W$!Fo4QK1*04*m*6D^!w-6YU%svRO^ z4#+Zu%%L{bI)uyxS*nofkR=P57c#4mX^@$PECd<$^^Rm4hp3F;`^OloF|MNz z9r>XC9QmMi;jMp(><~IbFY%EDVP#|v*7x4!jv&=wp?3#qIFZK6nat+_^jNblxwFEB^Vf(2jk1 zz!T&pnc*cE{t*RqcB0an0kvTsGoZG%{#Os1^e7LKvdyKGKQ6H}`e+?adgM&IQJUiWXxdHv|? z+LKJFnzO9Q#}4G+oW$Z+j;Yp}M>blAbeI#==PWn(advUl)@2h`v8I<=K5Oyfd}l%b zv&+h{mb&4_VO2LRNjh5PRJ$B?o9Z{UY@D2afZ}Xq7gf!^(Rt%zKI^`k=BsnwJo+ZT z7qTmsz2plY80LRJLRuS`rRt&^?|@IK2efFa#ywlS2V&!<79LTxcko5s>fkPg&Km!d zxq2fFQ=+Z+ZKIjry&;AZcfZx46^P3f+&x?xv$=jlBq1dbCGz0wzWl1)0(&rh{age=}vlcs~+_g4#FsdjSzJ!;5)UqV_tncuCigkd!o^vl^v4XX+{DKPu9zd8VmaFnSPq;w8LYK`$WoLoq9PwVWZ=$N`F5g1Poxu~$_Gc2Epm z)LGy`GZoOBvzMty{ir3Si?;-odOpe$KEHas@5=D87A3l=AN^IEGpeU%gvUZ^I*9es zOa(2IRc;9s;|yYLzo~2a3SLl*)Jq3+&z8WK5jqViZFfeCQ$J}hL@Y(b8r6QBJ(SzT zN~-q9GnGCroE*#+F>}?@_s4X%wQ4us$6Cnl5Bk};yV~D6`j+`65yMf&N?vY1 zlU8qkbHs(zUO+1+U!IAOXGuuam5S2~gcx=%>VG_;@fi9d>)3fSt)=s3Qs1iv^O5sO zX}qhn_THe1nXNsXUh}vw17{yfG_&6US~=)}JUvW3stx?HgXu`+pCbSF1&&0BizK+u zBbq>h%Hi4mFC&9#jrlq@Q}dgG#i->!?$?{!zKT8Y8?UW4S%pIIt zuVT!ZTT9{R_d7b-dEV$lp-Y7Rx!^rub>&NH#&cf zu+_=x3|kJQz-}Ibl?tq zkmj}CXoX1UAK)0cdj)s+lq2du-Eaq+(BIK0d)`t@G*y55L}jH?!lDnXG2{I_JfV@4 z!pY)$h^52BR$=2!vOnA#{hi?2$UeB=3+}hj49)aL+XVL_I4$+k&L6z!30@N%0@@qh zv4&QYLn^Nc%n>c%m#5bFFYy<4=%~{is~^2&tT>5YH!!lppm?0ZbP?tjdM-idAYZ01 zg`q}a6{VN(^JgBpDrv_thBUn|W&_nOvk58@jJHWr!o`an1!<*(B6xU(cLM{Ar znCi~^?PqGm6Q|x5K3*w&Jh#JW51y*4mTg>St=hPFY6n>}>z3OrF>=m9Pii)1Sf~>)I zwx|9+-}7O_L2KC3M|pX%ot^tUwMn|3QI&fmEBVz~xf^@x7ZC&D2T!#{K8$GAJHpbNeTn*4Ik)!7!%WmWs%t;*J&wLoiEixMa+to4_U$@s>SFZ=V_GTM*^95E zz!k*Zi+Bb~ZHjZ|$<<@YPpo@Kx;t4qR=Oj>=YlUu@Fo0$y5KK-k^Ki_d8Jq#Irrl0 zx#4K@!Ps5klVSC)(u3G>H0Y|*4`Zyt(>YML2VW|;f>l)737j5uMgCr1u8&E)kf%*K1&p+ak4-4x=W+pX7u;A?MuMOA@j^ zL$8xTHbKN3NW=`G)Gic~c(3p9_m5_8oF2!%U+2~TK_?Wea4?{M|7pEgYg#mvI;@>X zQ_WrM#oSlf2*1{KYNdv|A(!~gRjlYIvHsZzji)VG(U~j_xrVF>LN*5emT>Wc*l!e8fDH-^a45u&1IlU{-u4HNs^uttS_Imf*}_3C(jZ zF1;%@ah8$JHHmb_e=D8O79UTfvOazs_k_r1W$Bde%^IzIj_>j4wf2o-`kK(>7%cr^c`)3niXRWJ)^ut`lsh& zN0EDD#zu3h((PI>uykaz-M?iiJL>c@kFCRdMDaecD7`~H=H=SaHGEo-9ZmDnOtXI2 zeK={PaMQ6%Mc7oV@T>**N{IUavw1%XC!7wMpdp2T+mTnKY3}c6(J{o+xwG~zh$W-EWPHF zMMumg$WFY}d*_KwOu?Q{NhNma#w7>Kd$r@UumkX<*XcbOzAUJmm5z$I|2`!pP>ua+ zKC0zlO8p!Es~B$}hB9hTJG?mF(!2J!Wz^OKGwPM4-}Tge#7y~0cuKod&PsLB)`*dw zau7EPP_y?2eL?pTRpEUUUKuzM8HO7<7@M&tn@6{FFr(?kP7d=l1+r_L0XjK|sg=THuWuwW%6j(`Jq2-ISn!55c@w{>}MUKlPdX3_r)(V5PC?4Lhas(LGrFz*#; z^{L@)$JF6N!hFI8AKmDD755ZY;<*>8#=Bebu1S;-57&?vurZ}3_hu?Hu_p8yGT&Kt zeF?iZ*wqqtAB4@Rc;*PZ_uxJLwB7LuyJP>2-O*>+9Rs@#_-i{aGrXlMRA+cx2dlYw z=pG-PYwK;pPg@?Au$=R6EDt%$^3a6GrSRC1@c07Q{APgeXp-Gh*u@T@sH;4zC+y-p z>|co5N-q-$s-ZNQrohX;9&hqBUgg3k3jW^*< z6rTJBPmA#8YrLnQ_GWs*o2mcC8#*r-5f{p6rJDwM4IQR^AyXgQvw|dXEf`#e0-^mxN0}j~4H9afZIZS1R6R*k549 zRpAnx7FC9ysc-3GGslG4(Yc~;2(@$s#E!1#cM;WvdlUm-MQr#w2fm1u;+s0q5!r?B zhXWsDr^DMocN_jfR3P5X2lf#)E8hLqz#ob7;@;}OJCOyta?~rV&%_Eu_3k?1V_B6( zI%3vDGbcPJ>f_%q2luin=A}ESY&xD!>es;n6l*tkC1*AwAVPjp9en2nTpr>c_0;9Dt2$Eulh0qOPwJ|Pe!)D zrdiz*psx$xLy?{Fwzx9N8cr&B17+4Q=Z(N_oRO{Z>;}>eQ%2zC;|O?u;lXo2odfFp z(^UDvBFL1k-DOXdHTljx=mF<}M#(|9kU!*Bx*AtB`HBt>H}t@}zz;u|C-~o`D_!%! zXCKTKd^*Boi<)pl+g$K+#8U9vNNU0MNJ>FV#9pv1Vk>wdl3egy#9Hu7B&pyx5xwA7 z5%1g)@%T6!^A5|6U+PO`?BnG4>Y3>*bbrr4;J056T>E(@WBcD9*mdy^SPn?(RTWgoC?> zPl~!Y7iEjn5!{%kvUQzRwnn)+JVyDS(Q*8X4tBpQvT>5jvcyP?xFTI^Aj-3!kxkKN~U>@yv$ zMCm(faVnm~ioeF`5$PSlF9ja-5{27#9&5)d@a4fN;P1e#9ARNCES!m78bJIz*m*}j zVk1cFDB`p0i8>r9uSd(crM%WE+6!|(S$lId~WPM7FvvNzVeN%2T z$#iu~Z5p(b!(RG*#3X88mg=&)u{W5p!YHfzIPzq@NyHHM@+u~V7!RSdTSf(f*9 zYikEpavx?zR&_7Vx7VP5b>d_c^`iv#Fmr^3sbrzW`%sG;^3(B0(k|@ZDgLy3gKuEp zWN)MI$QqyT$enXN;&c@@Mt&SY-|lGGZfmT;9nInJXX1REYnZuPF=pA5cR_+Q<|j4M z+W1~?(Gex#Wfgf@f?s8MVQIpkHxq-1uc)|F@leY-M-&C|iz$~z{QJC{S}@O5;b#Rq zDlCjt4GS0kHNqNCe8U>c|4#T!Z{(v3(c4!#SXXIXe*Hz$M|<;X^Xo4Z-|6+X=KF)w zYx8jWihDr#{xrDfM7n8oWnL{Gbrtf#CR9c>!YSd|^!j5TM6skGS0KSju@*5z1yPJJ5U z7uB9q?-1Y1;L{5}c5p^*Q9Y$ngzshbZ=FatkFPAM{X@ixap5nN!?f3986)>a-VL%* zPlgxN;wBc0#p7{HN5l5VV>a*N9cuZ{bqjv+rj)B)p}DhT+SU01K5jdHr(mES#hq58 z1V_SN6}%~}8&6y0q;(;c6Vkenq;Iun_>=v6gE@_x?qv_hyMG+V?;R59UVJ9q`Uz*z zGwL4*UR=d5Ztd&tI)A3+$ezjLaredWZxCBR4kjeN`t?fLaZ(Or{8{-f;j{Mx4@ z$;jbL;48CtDVu7_a%6JD~p*#Eq63;C0fgoI>c%492-dUc z;f!=IOoXCjjnL=;VJ#Y(YgiLr7~F)~?&c54BLPC#ALHe1vqoB8Fpo z7#>p#K;Nl-?)`{=)Z(m6=p|)&jS}l0voC!Grp-tDJ7v<=NzIs3!0`xOWF7kA^E)Qo+FbmPYB z$}*(^>uBuNVnq(D2TyZXmLW#j)j@vyhADKefpt0F`=RG(%WmEkyFZ;uhGNh?^goIC zR37)2d75#PbV^pUA}ks!X(Qxn$SEChW2DP*1K~EGyd{`$^fGv4*mTW1(~& z9j@|{l<ts$W1P;jt%PjZCiI&R##W}QBYBwi$1vq%gxALo2BYKOAc;<0X^fp`*>SbkWi#U+#fV>zn(IpHTXo&XOJX`qTp- z0F%dj`TNPUkAj1qdBP#g;8^s0Q7WJJ9gJ+uaW8r(k)K_C%#-8K7I~W-e-FQXNE7t- zK2`vX)06#H!C!#Bn(}oZVpvO!w?=3exKVK=@^$sM^5sb6%Yl43u&b~6y&kg7qMr8>Rtw?bmjI&KrJM9CUAoeBAmFb>4R8>XCu=V+0Mhkm1i zIBsaT=b#Qhh!E67kJ3T=)x1<`WTSf8v(WSEtu^b6-@5FAXDnLQ*MmM&ZK!FiY`CxS z-A47O;;9TJ-(Gz?QFn&!yZv23?G71jB~-wow+v7&SoG!rM;raZ$b_3N)$5#AJ^`o3 z$L|W!Epjb$)Y`Sz-GUxtT^W8udd$q(str@xVrEx*^XKbW$;x(m-+|w+l(wm>DtCxl zwG?`6!xVVX@HKi#;7Pa_+B#XEES&m-^LPkq4Ey`czwSN5(JE%?55Cw9EI?(-cr>sFU!A5f#K zO-8BP!lBr0XnidDE`G_zq6>S+H`5K3m1T5qtOCEYptBv~Xf;#{p85m3|DML;n(PKX zGUWi-QP8ufB?aM;&>0qY*JL-6_6z;gqtGqe)W+m?@^cepY;h4MG_fai9)MP7i~6YrilKt1h;XdRn^B-t>9T2f~_D?Z+Cj4=O1%_Geb z17C~!b?>@C`+7Ls;zf?G#;^NnN6Hv0$db`3p(f$hObzC_7opd_9`(i>{WOHp0ky~m zE??}@^x<|9jWL7qP@4EPdI-DK#`scq%IFQRO^hV*?$1Pwnsp^R3{4(>Z=DA|u;_8@ zR-hh>{&~u&u85JA8EFj_Y3&g)ziq!fVgJ0-_FEG6=~m3oLXPO_RIQz?<8Hxe>#lEE zA0@0mdY1L{_H>+dX0)^DYQ~O+*qu!6dg7K(vsjTGb&0I4j?oB6$ov@Td8Ug8QMZvBJ?hV57msug8#)^yDnWqFP z7^CbA;qlq=pGA-V337wFBT^;mqQUeB?HzNNimJ5nA4Uu$XZJapIjru-&O}Kdj8QM% z?K0v3k9V3I@OL0G#a}P@$0=UwWu>9w2Gw&zgW|DtEXdo}!pD6*Pr=B+3bxKGXk;Th z@i#B1|9AQo_paD7_wHJCk=4&I7Tn!Oqq&X{gZ~kDYMbBXHMFp0IQOP;nnjl;v`pWU zUN5AM?Wy?v!Mf7Q&IbJcU|p%LCObGO%6T^CmKy?j!K7&g-t0iqw5tNy!Gg{ZemQ<1 zfSr`Oravb zcORWzUrvC&xRDxAyS^wFH11Xp%3QRg-pMZQ4G*hX5F9ow%{z?Fasvy3`JnR!4PBg3 zfXU800=M!@bI^gqlGM}I^SN7pFc4J`h^hhu1X{W!7 z&_us;#68$3&Zk%d_H60=DD-MvU*=^jv@?ot5aHb9q*5K)0vF%+xk=8FZQ15 zex>(R1iN#U>$gpxUbn2WGgMi(xNez>Z&DL>!j@qkJ=e3?vrNTTZ_+n;ZlFD2Po3um z6<VZbnq?(Ps zp8Yh+u;^U;?)bz2t>8?q`Lj`%uuj^QcqTfSYXGZwmq!iJ-`1!CX-&|JL4SJ=daC=w zST9D$Q{C<8si?N;e$+idYdPG)!irLh zcaO%{kH5)t^mXc=ao1JHY?|aVz9rwd%#hwMq=}f+N`()*gS3WA4X-cI(X%`e;|1u8 z3b0=SJC@fLJOPN7Yc--eC89(NG?!fS8= zeu4OH2jZOSex%Q^_7$wrYLilko#j&$G+F1aQ{6vG=pKPC$rxm}BxIjK#+Zsm znX{@XHo);~mTyTeVaA@w2Bp7yb-&(*wKnFcgFDuAgZF^{>MXt# zdo!{;>WLAH1vuPUr-JNKk3b`^(0ez$|7MYlWzn_3U12t#56@TAB zh5T=Q#&1|DY&633)-&2uFrc>4dj zH{ZIVZpp$)b7oY|xZv8k^JbKn`7c;lS9{aBb7|$^be;{pcNuR2CWj!6!f(U(*&)7)|g4qx}eR1wh7t-`m}Q( z{=I)IZYe7-gNOec-CJ*21kITZOK$Q_pC?kH7gtoxY|)bjX(V-HZ9U~$*hHko*Vf&9 z({&`MT5?_Ot;<%jE9-B%e6G*syLH(Ou4y-|T(aW2+PWpsPuO-{e#?>-WbbUfswKD8 zlhQvp)A!<`aQROnAQ6xVNCYGT5&?;TL_i`S5s(N-1SA3y0f~S_Kq4R!kO)WwBmxov ziGV~vA|Mfv2uK7Z0uljoXUQn6 zr`pglL7t?z80TzPS(3(>5=W@Tv_|o=xW&ZjV>L4cLNAhH*IdT*dOX=Pncju(r+CJL zz6wt|H}q!ZKNnyMS5!pM)FdrOMa1vz~5)T(I~Q(nqt*g#QXR=M$$`7Ko4O zr*IEp^AM(Lruv&!GA#umyxgWRozmc&MM}I_KP_PC$&|hip^5bGM&>B}EIjmYIUc2* z(mS^lq-wZ=54oZyTxmxnWvmfyc(s$9DPKf7hJ&hNIC#i{fbn-2k;zxh@KyN|G1L;W zp)^28o$(8yV``(c-$DZF%u7h3n_h-Q)h*Q&5TP>3x(5NKofLHiqH3cb25J5i@$Vp_ zR{AUAKfwzQ|G08}SkhY9GP$jXz*)bXhp=kWu)K@cm_fBvX37U`jR8gT zbP|j38H3>#X1bWdKSGk`86-}2SdKl4uWjD6Im~k62&^%CGNs>1v}V_#YUv_cw|_+P zlSJE?auEe|Ut`$l|0~&;LpI{VMoK2!wJq^v;WuyDcXDSl!U!Pr>pmq5d!@?Rpp zL$@SxJL0AJ=Zs~RWT8S#8MD|7ODy#nWX)pdUqe6LrCOYPCj3a7QHhj?BqGe13ntTu zkT#E)p@Pv`YtSgy?il4j|Ji@6c$#21PL!aUbJ{jPngnlu|=d#oo^erVk8{#3H z8i)SUn+VPv4*|>k0Z4RG&%!_bx6gu6b?pK`WvC_<_mS%L@Q`JWftY8019M7d3M491 z{)|u3m_I|u(6^Re07>S5L5F2Ng#>u!7s#uUX(!8>1)#Oee%LWFWdlCe3N!T06e&5+ zdhrMN+WAz-FD1O0Jq;$TKB6`IESRuP7Uf`np5jg;+GhVP(bI``*fr9hN!iP=-w9*Z zIYbY!A0qkXBHQ*aiJnjNQ2SnF+j=$8S@xAg|A6Rhro0DFt+i9guVU+U0R-7Erg%Y0 zhuLRQn#+jR>?0Aw+Ca2!UqjJuCE8}U5&c7=9ri}@McM_dt{{h;X^(RE< z*$XNCdx&<~ZzBEsi7sSH8Ywk>LcU~KH@r%|bdc^w3TO5(={`=hW}8+unOUD8TDQ$X z!?124+GeYoUdgP#BHCeph~jRgd}c6ZJvsT}4G;nU?SF)x8taEt z1vL8(ALzgMK)dX7$ALab9aSOA(x_%D+X?b-&OnI}kk`d7%{|$s_PAW6K4>~&+Wo9cSv8HIc zBiUh_F&fF(pNGUYlT0xC*GSzqi)hWBg+SYEqIG+W;?5x&y|M>oX`6cj(T0wPZwjAC z?%IDw-d-{pI?Vnw`FttS@cb2Gywo5~q-ePwuT^-2cWKPD40Mj4lxC3Fq-wL6o}-bu zr7Mt%N&OfY<~~M(^Tl)`q%wUX8Q)wAU-AMNy%9n*{mWmrH27gR!3eM54WO?# z4}UQo+=aqUH6*TDT=~@EiUDrUI5h`leZch^ zg>m605_3_@<%(eWyy2HqS}Lc$?6-(LVh&P$4t{PATC~+P-LE^l-MuVVS@A=(&C$~2+mQ+y)9Qlpsc?sM-=x{lrLrd zjX9#g6Wp?#>yaV;H1#;j`l@pT{J%2LA9))Y`86>g;2Bwo0yo&dgB|f4QlzwA0FcO( zYVE}2a5jd&5vuRw8OToIecN$ERf?W)&Neg^=S2iJlH&1%;3e zKxQC^SuQE-t&EK_lShq3@Wz2u8u8_uH$tDr8mOL`8k@cVZ>Fg*QWx{%=M>Z1oF;U-j+~qJ@=gRYJxI*EoHRAv zf*N3YPcXXPOd)>|j4f#{CXA*(3dWICNzD6#$FswGRX{PG3XJhk~il?<2K83udBzh(i9t|AKV9dJH9FIv}zz zRi8y62L&@-zl-7=;>VyiOMjf0k9abQHlWj7)bufTfLWBeUQSs1oyCF{glE^3T}g9&7`ny!EIKo^~A*l_k?0S zkGLL@qo)+>EflX;g#AWg$?u{%QjN0pfJkO0s<+8hVfPIRIWxZj+C%~o^7p|Im6<=L z5E6(Gn$ikG8Z)1y5E3MR0c%uxA|%06kqLgG5l$Hve2T%(8stsPoVZ=kvlvr!h zoFdg&Ykom~({hz&y~0E)Gv5L_)mUqiScGpG47V_I6NMXVO%f}{%-@lw{T^Jp809VH zhe12V%*shK5UW$ntel6@<#DFc%*s;nIvFD8EpJo9PNkWZ<()5xq?wgvFB!?`LJoK{ zge(sa-@FVahJ1vA=gs91?1!l#;S6FYgY5*HDJB5T)Qb;6Pdaqv&5XZ9(WZeD+Y2|M z4zn~dqsX`dCCnei+(&mo$T!n+*s%X7*4GqmxfZz%79^!Tt)+_)nEp#dl8dwz6?&}Tu8zh)T{G(S??mO5z;JF7yV8m4uSX? z5q|^m7!jX=c#4R_AYLTm_#lC~jsAN`a(hA02%S+&)-QS$Ebu~-V2YmPqP!~+NRQ=}ycZEjPtu4y+VY{tR!rq2 z{@F&b76fXn68TFEXag8&X+R4mbQVD2d$)NMV{DrS-S6G;`9Iv|5$XJ&Z1bG8t)rjW z)=7F78OcWtwTk-AOm@(^(bPyR!Y>{S$F>gb_2@=ZBXMGpoouYfi*JX>CKlN?vB3BJKu;uEPtiz6ES|C0_y+~}$heVE zQu$|;kZ8;{(U@(bG24vBES5=06>ZSbsWB&sWs**fIY}&&bZX2=d&!91#xI+IHj=Ue zY4BMzXJIK%A#pyNre<2ol_Z}ti=4ugzz$|^3iM4BDOFSWLYk4KRFc*YjM!rCe=UhM zmP8SM4AMdP#<383jWh!_5GDEXdJK=i-pow*fKI!a(q2bmlUj^5P+BJm+Q9A1@>Kuw)pr4*|lxY>f&lJ&h_) zjxd!6&({ejXTqrAWR7r>)=NgQ~T!nPUp_|MRy?w55@&WLf6DU*pLZ8pi zU3?4H8N-A&b*i~ys2DEze}W(CN8*>mR1O{j^ftVO$3qt&rmy znj*`)Hz5`xYOdINpcN@!EsWR@JYTrI8Sye!Q^BnftNV%Yjtwg&!33eY%RIQF@C8&e zh3dtLeSwvEy$B`vC>`57YnYA<@o~tGvK{~q+dy`5gq^#fY4}b0&Rd6w5Q6^(Bx%&8 z9AS4G_zcm!^JsrV>?&l4=AAG2ZxB8de(Q7wGRH_YHhd?c+*t%N3qi~9<(p@~tV_7nNnY78ju(g;-btOp9I!6Y06MAu{}`-W zRH2ik{0!KkWr^fzi=R>g07EZH$OgXS($M(`Xhba?fmBZy5;Xv-XLCejm`j<;yDp(9 zl&En3jS};`L1p_HJQ344zS*;ca`+)bWSZCU&4q(g8mp&h3rdBa}SYF?CvFFncFjiQMlJ+>l7Cp;Rv0W~2pYpFzULbH|*JoIln`2QEP7Sjak#{NP@ z7)E8z#FuYw#oPR6uwCfY&7XmwHpNUd5##SrLA?VR80a1#-S@#J3l*B;@!yiUU8hz0 zNaZcCbhyJzWt8I2Naf|zDm6&RA}Y<#$ovu116@>_pHZbr253pILAd}1tk^?Bo3|P* z9`*{z-V(Bhz9QjO^J#la$lhoeFzhWMdo#dVL?v88iZ_vYY}f0f|HZsjY`e{Y3!-1N z-9Ty0gb6?bYV)57AYw0|tl36U@I}8l?S{bb1+YE}wo`XNk9v-sdLnw%VmozJ^r$24 z)V0u~j<8dcr$;TaQ!ArKEwoepq(}AGsbnsaMY>(%TcHLeMg<@_Z@X=XO23xe>v*ZzVE2h^qr$l(|3+KP5*k-NpoPcakMGs zz!q_|`TcWX%k=+#4s4l0bKvCB`XAN9AZ(R5PSpRT9w7w5lrcRl7!6E0x=q38Hs72% zOy4IMoBhYA0T@Uqj>CQkuHIY@QBUQiNGPd%7?5y?`LjdJpB-ZU?7*Z8i{Zrlxd+ky z+xasYNy}5F{2Jf%dr-+0fhS8>sPL0?0(BYi9B zEFwB1{RPswo@ku5{DT6PQQzl03^_k$)0sXFVSIBHhLsG_B#%vo-~rU}A!4)q1T|Qi zzGhy7+@v4^dV9uCCL_Yo+aRLd@1aXU{22tx`ZcILXjLG)ytkONUWVwO6qucf06Ox_ zE(D>Y)npeZBrL~99{sflYG0wj7E&Ucx19FsuS8~|xn=D^e9~}H0-xMN3H%wNSqNjf zbZ~SMfx^enhHeDgNC7NQn~ZnJiyI2kx7$!842zrjm>1(q|P8g8wnmK@JuT9fnBcOBSAuW0<09! z42KM{?0pFUvQH+$vssb>lDiay6Cgnw18D)DZBp$Nhb2+MA=nX19WV352)k7)VW9#c zd^09|i7c(6EYXtO$kHl`=|#6TWD!OAF>P`D5UlGi#BD*vpp#ol4@0)=LCA(7{S$*8 zufhTfZYcU1mi;IKMG0`M1EINerZ|43V#H%%6z+eClrhJ8;qd;R4D>>A}-38x{Px!p=L12P9l|R zqM<*@PWtSehbi*TBx(&RRU;#GXOa;*g+jL)p`V`)-D-pu-bkTlMWyO%#4{@*-iX2T z0&C%j!O2OoXT+Jw#t1qFpvQhu@hh-GkMcV^yA_ydEQFypF={lx`5WO|2sxpDBb`wE zUtiEk?DUH(JH}m|@7?MDF^qqEr=NDd{_ReG5CNv2$M7s+HbN{A+lb z_Tn|T$?q_|j+;p6?{*+drrj!qG5up=-V}_Mbj76U%(O=^y1tP@-csL(mJR1I#J#Q3 zm6_zkKFbaYG4@#~G5c1$XwH(d9|W$?OaN^&_E|_Q!fzN1$3Dx|6mIOZkT|iWnJQ-V zmhxXi^u678VlQ(oS@5DISl*`G*o?hQa>i!tWs;G!*WfxIH4{>kIuC6%JwSqcccCSt zw9zu1PmrLI;=K%^F^kDUSjKB$iC|8uP<$~N`3+9ljlr_P6fniAhUWFKjiEry_22r`y}oKBJ1?KxEOUPO#U#rqEksN%hhEYQE7{D17d zd6*N$`Y+zy=_H+`Gm~VJkXgwrz{m_Rz<{Ho3&ZGpy@;AZnLk^eHBTvXd6xf=%d-}t#QP4Qva?d_ei6@Isf9X^-ZyupmeUsp zOyf63%)W%`gOM)&TB;it#{teF7@P@#z$AShV9WI1S%vt9Hl)D5n-lz@?RduU-$SYv zX2)I+D8ieM5$5YF+w$Kw7KG>rc;oHAgF#`1LK5(DKggzL+=R6A-^=o7e2pyd-_HTM zu@yc9)AT*>3}|M89p0psZSXSKk)W1;>~t;Ii3ZK+8HFGVY(*b~PYSl9Q;<9gj^!Ua zR||IL@HeT&%(L-7JPS8Ag5og(szhX~g8Ltfq>g@xQWQKuxw{Px1P@dpts#66VJq4L z2@&i@*p8l#nXcf$gkw>xd(nc25KczVr+jz9ndpg#cCe9fN%R}UI@p77R*R2BV3r>2 zcN0T?oSgmywdkYpC^&%dyu?4S?l3rrK5Kg78K%P#MDUCseh0MsAtVuLspVzh%!1&E z9W*B?Hj!OjM+za9MiV`pl?r6QSs>?|#Kg9zpy zdzuz(B4|ZhG1G565wIP-jCPk1&dWb`{A4Y7Q$B3Oq9v5Mnev(Fu?+9lx6#IwXr@ds zHX`ZA1!wD|rMgjcu1;AkbpTdq2G7=gK}0@vA2|xKQnxcL6=J96GKtO=omlE?7N7I< zYBVp&RE!Q?Ae>CV^2UV=j%rSsY+c#oy+tYK&n%9L>7on zZE6 zt!mDt$C!MkVMN!qN0?R7 zTUdS8VQxgLj{2EX8_oh;8{NrRzH%+#y8L73jMsv%(|$c*r1Bf|vKwF&rZ*W@V{|Q( z=&zjH>J^>JJleDZ@L~DK&VcT_)a@HJnA#suen@l;LkZjBAa_&@6*+&Idu-T}D!Bs-f`JE)LIEF^Vnqt?)N_0}6nRMVP;VpOTiLmB3nR z8YACY%A=XeG6&j739=9ji&e~|&Ey;y%LKdY{ev*@E)%9vU@bM1rMrh9fz+u)dg@aU z3p@2UiuKmlGs0S!w4T9&yo9W5Gk&s+jr<}V2kgd zqjxI!2FBnn1y5kI?lD+oi^mfF-PlYx&RQ4uv2&2s+g9cZI9l=vtedUt1m zHMdoJJNdp4aE@lJx>dvrfR|20ghLZp7sA93!6mWPwPFrQ!xgfiqLf3@NIy!1e?SP6 zT(Nx3909nLL(<3ql7)Yf%MWVi9P&9NjSM7Ng1N)xM-=|3i?>nuS{FC8vPRwh#TQ1G zk@^s2#s1A#2BwyJn8+SM%+ys#5&L&RtW*h-%GOMZ*{L&-@3t;TELDqywhcj&sW+(O z6C{&54)w@31u04OA>tP#o9czMv;%@vr9w0v6r?)!EDDZo2~wL{fqb(=W_tu$mm0xv z!oq1tA9{E%&5j7tE%gC)Y?JYAOjQ$!3THs-QzCgLlXysKAxgNNFP!12cIX)Fm~cj? z&S$ja!Wo-7i0wkcWNMCU`7YyAARJ9^*_#%UW)aejLk%VdVaeM(t%T_rY(@2y$;8ge z1W&YcFVM>$N14#dCxVMfo!by#v}+CMF)3Vjecs63z@ja{&l^pDwP-7ZmN%BL8T|~S z!Mt&Vt!NPvFK+^2J9<8HB5xAmSTqY?^QI6^M#mtuyyFRHqAw#6@@5b&i6%)uk#IJ8 z62qEFxGMTOawl&V;p%8B+Mi9hHrj#qPbFNZ8UI8Mh&khFr9Kw1uj0onPC-o+}zB}Lx3Hzc!st9{q^MqgB788)2O-A3@(B>fxch3D%Wt>`k|h*(RJ(;R4O2c6QPIke#$7L;h`Uif z9e1o#--Ptb@9`<*jW=L8e?&{TX*>gq`I4E&eH0kQbgD4T{BfVcnk-JvpFmJ8PR^g$ z60jNVK@TQWRN~0Wy`vX|*r$L{A{oK7#c%z694Z z=O51k`K&K-%+WxmUjyVtU*a$tn8BFr@+B4$Ie|&_lP|Fj>6S0~|0@ijVC2tw2W}xf zVrCNZVNQte#wF!DUo+~FWce3&0YxQHtaIBuB#lg6mdn&-xlCP_=S*G38vKwcZA4QR zTSxy&`Rp58PajJ8>>GQTM)G_}D=U7}O@O06BBSHCvS4V@87LU>+X(B?L*Q`yb`}yN zx(gK|eg|PQ`YLqecS_;WjLnEh{H~F-Sp_={@q3Sjs4N7Jue=tLSZ2@*BKHwCqfD## z1FIN%bR|_Edvf%7 z!UCh^9(rf!ER_q5mX&nRC)i@6B@1la6zn7?iT41)Rf$Ik90n9Kn}7(P`6YZ1 zSCh!rWh;rifyjasGv5MYjAW3{FNcAwv?lSFn1tnhC|I6?=X$x0DrIQKm2_vrk6_p( z@lEGID*7;E_Rb=JT66)k`(46jbS2~X9$_mQL6wTXPuPy$&7}N*a4ee7G~P@&8LeU} zd`LK>oE4CcxE?b&qaA(SS`N@o#y{aWEqVzH>t{@LE!rJ^#y=-)M$f0SUl6vUeF<+T zY)i`<|B`S_Gq%&-SGU1Vn8uhvPDd9ruLB`w?m%pVud;&rb(YZ5>k)&*3^GgiM+6E+ zQ6ldnNM!WB%U~e7hiTT2pcXv}a(aKlW^^O&`T)XK^aUvC0}0#F`S4C3)DPmZXg%cz z6OKopM7rri2q&T)khb~}w?m$@86sAwcko~7jiL;m){*b}Xp+&F zlk_=2iDGxmxlnh^qo9PBQvz`imabKoXrT#QiNClgy$HG+4&+d9E7SPkV*RQy2K&kPQKj&!>uI3inAI`e(MUb zpGL&n@MXZ=m|AaxSE^wHqsyvwNP7Jvy%l0~U0Aaw;=kVXPtV9lV*YP1(n?a`Bb`aT zheq-F!k-xB(yXd=C=L1=FnSA8+E4n>%g`B&SxH+rN8KzVLwofuU*d( z^B+T~Z6C^WEJYHnhFjL_?&?!u5&$ii0b6_uHCF4dl5c^jpV1%5N} zfh^Ob#n)$uPh`H25&qwZ%R;XsCFz2wCAHmP{$p|+yBfG+DUNZs*_aQI!oNfGj8v}{#bf# zz#SIc10l~SU3HSy4zqz0lhH!UEw_Dit#ui=U+ohCBXnLHeW-GcQJDkR!|YP7f(fUp zR*h%1DiI$pL|H?=BYJ;@fGUb5;_MtcFF8>rlKPNZEc%ud)~a?wN4JIkt7oAUr9)Y; zC2z0wEaW*BT3e`uj3n!xe1_EFTh_geta|lGiR;9b4KP$ERc#~7^YgINQC<-Wx)o@p zydvDhrpWKxX`yA1SA=h~$oYL8Lm$?HyD8k_3MIc=D`@W-u*6CC_`|wsoVz@YZ4RGb?!_p*pjy_CB8c`)X%ZtB9 zS@h2!DhVnJMy>SQ*wDtsUMsNQs#C2j&x6Z3avm zj@Om}pxM@K9dU`KQw28H#Tr*HGn!_EUrSI=7BUAq_dmFYUhJ?Bxto*cxp`s z(5?vpeO;lXa?#DS4&F)Xzs)yi%jOd<9Q=pAE-&6}Hm&=F8M>Kx6K_ zeCiF66F{s+$H!ly4E?^d7r=4g86EZq^}pDmz? z;4dhSdM&|KDENU!1f|y=3G`i{!9@^W1qAPjYH<&_$>gilW~1LTwJiDtCk9_RF=%jN zu!1r84;vf!)E*0e`i_h-!2710Ee!lO(7Q&}b~K>v@V`PrPrB>(btB2ahpwRHDoSG6V&Fq! zXDx;Z9>HL?J*)+n0zHnv3IMbpTn}Id0}4D%g%L3Xj3NRBVdG;0>rS9SB%{Spu(<)| z+Iab@!pB2}m$@L!Zz_2CtF%EdXKHJk(>;rHX33fAr2D-srJSGy|2M_ODI@NN7Kg%^ z-nSRrL7|45OK|u11IpQS{~!S05Eu&JX99RUwJ?JOmky+6bv1CbKhP8fj83e4u>G9? z6cOkOpcR1w0n`yV1OQ(Y`g;OE|B1wMiqC<_$vea_JdcT zGLQk2mr)VmdtY9@iU7xQyn+=03rt?-1(F}k6Muzv17;shtreu5lDrurOwoBxiuTX` z=aOuwj}hyj<`in@9q@Qk_Id}rPoZX`t@%#72lqe-d8Y+NA$&b>1oJU40I)Bxh)!eP z0wmwr=RhX7o-*}R^22>CYq6y0Eu}-BpYOgeXC8&5Zz~thPpH)4E5J6X6d6w=yGH?> z2wD~X>rEBN0b5jlC8GseKP{3*!1^ZQjh-M^7%0Ja$l!yq7QKlU@B9@xsp`dZ5XzGw z!<__Af>6E;8SbQxJd>5cBH!VJs{j-Mh_wg61-{Fn5tm*rjy?)~Z~`MYs}7vKs9J%n zYKrm;9{t)~2wSyppF=&oo23gH_)vtdO`HdOHc-9kVdQSG7b7;gHwea6rv+v7GL;O! zuMw?B>n60PVovin%JNACUC3xxJ*@YvMohhRC1Q)teDLI0gVZ=h+D&57ReI*(1Ne;H6V z+ge~OT;YY6QWxSMFTIWS6UHZ|#>qU#vPm3KNVwm22n4iX0Ew#C5Y~g6 zv$)q1HiF+1ZbxxnunT3{lYVIMeMY^*g@AimC(J$$k6zaT?yJ64DuH;IH?O1`%P8OR ze#nF-<93KEfmcH8OC#g6;9o|v-}feF1tMROa8;!c=Amxd)g)Z(9}>fd{ji`nHG!w* zLN4|b{u>&bywPCeYZEOW?TFP8jf+Wt?G%+K_(vz){&=IOJVBKAKskO4*q0+SHTy4= zZ}iuJPz_vfN+2s$V2vW*663*mH?XgRd>%%JdxdI0$>;|Co8sSR~#W3C| zk=X4y@v+Gin?WaTcAQ8o2SA%!op5F&w4ufv9aF`QNZzXea#Pnnm_a;hjzy}gbZU#% zMWxfD62x^3;zY0+Pt87!@~8V|z>bnX&XYggN0**}d>*C+t$QRB5i{u7L#XzpVS(NV zGkVk8p4yiN)wnRJKsuVQjaiTgU`UrdiCQ~^p9LOIK%H(RS_60yz>BcL6rE#gc|Ae% zqE>-02bM$oE@M4>S79EG#!f};F0t7Fn<~tEB+Q9kn9GHK4#V8&L_P5-0EXEBD-3fs z!o>XX-eEQ}%&UzC$f6BJJWqslO8V2Q#U{q0_A*9mmJx%HN<)6Rtb}HHLc1w+oMA#J zES6sOygyEau7!7bHrP(2IV`c`48N!GDH=TJBm8eX(>*=Y%W1mWSPvnz*bpj1R;h%k z7NN%&@l9Ya0YkGFvMy}YFGN_qM4llk`Hea=?>)+21~%p6Hv^DLaVLN`kYe!_F7PY> z?(Cr1uV!KMdHoRt;tX7&np)40o<|zt-w-Wb&e+_n-wh#562j3IcTr%x2=qnTR|(a| z@H;BsdX3lFi2V$A)cmc&J0OJUrLdq+&?!3sc)^5I@b!lnIuB_47+Cv^p2bX>u(vXx zf%;5TNtOJ^F%ZefffDC?p_P#WJ5aw68m|J+n+x%su!8czX_c45OF3TAm$w3f zR>jHp5)Lc$>(2tgDU9y3ldr0b-~8}0Ta|G{%gcXh8NWT^WmcE*BOYF6Rhc_E;A>UJ zVKOiOWo7QegjrGMKBNRH%Q))g<^PM;8|h?fO=y0czJEcv>ie$)gTIfeoWB3xd<65S zkHvdGHpq5- z%M*}uzHxaPV2F<&zv2qNjvLk=@4!F#&O11OWZ{<}dxekn#~e1ucizE)B!^yxP&b#4 zJtS%YN2;x11}D|+Bg-K@!l005Uqoc2Af~;N$S6T9doz*Ig4of+dkw|jl7hsdgNYm| zNYb86v7-dZ*!gJCt+9fXM0@ms*wF?ZL8*I`a>p1wfbH{n3%82@hto*>`Er!eYd4~NqgtT)#y=+EvNt_Kf-_C}Ij?(!X%H-UI7=eSI~tmV zj5{a41QAP&@L?i}msnOCmb8S7MMta#t{R;Cz)rmgv=i8Aj)o@U=}tC4sHe%B!BREm zM@VLPyA>o2&<#6|N{XDqsayxJu(=iK#W9C37lLCFm!>{F@99zftJy{?pfF zxx-^$XFhW7{U~m*_waR@Nyc7NO@FLji$&(Ys$Q&#{zq_gs@J6e11}Qi`YL}NA0h&q zaNDPPy#bO_y~qtcgIhvJYJ3U+)yn|vR45 z0pM1zk6_!YUPQd=MZ~LKM7-)n#H(IJyy`{7t6oIB>P1JItJf%C`&2J(fbgHH*OyRp zsuztr)r*PcR4*EdcS1?g+YSH~?<>){C0L~NW9pJ_&v5~y3JySCc%G+6Ok8tcI-+vKBJtqm_O%PICN3t7A=wR_)n8WAf zIUp^kbv}qcL+dGqpN30Clp5kAMjz(2paYs|G-B@)82JmZj0rgcT7nft@4N{NHH4v+ z!rt_tGb4>`)CI&^BGV=<`ICy=IfwGObym-vmWk6&0VmcXYK$c-z*0lGXn@cZXO58g!v%g z0`p3Qm^4ceR?0jJ^t9O-k}b>{*vy!R;9h7xj(d?g3U-RkI}l=t`4A*a&B@RzGe3ug zmgaC!vgXC$mYV}WuQ2}!`;}%}cv5990;QEX5OHa3UJaQx<|c5f&4WST&pZhswl%xL zevLUA^jdQw;CALCu-x9f1X>-;H{nB_`7LxinpxQFWWJ4iXLBNS>&=zmb}A8a;4{t&YdDBaCF5muwQ4F2>mFN0Q3 zvmSO1HGcrTm-z+gz0KDl-^awhH`-xl1~&VeuY-HI*$Z$#^RJNaZ{7mk0p^8}8EAe6 z9|oBx!M7o12hfi&Ti`y_+zhQ@W;y7?%@(jZ!t4MGBh6O0k23Fv?r8H_csRzq689s` zvv5DkydL()n%g0Nw7CWT9Amx)`myHI&>Cm%0eqb1S8o;qpP`f+HBTBSHEN2;ul7my zt7($J%pmv!KOkR?odPfUKpD*CvwpSvvR{2?<5zpX1=aUD;BnqB@CEGqGW@ziCNTrt z1kP9c2Jlcz7z(h(_tkw&yaPasA2dLhqpEPse9p%&HzWK$%zVK|o)+QvVdjg1m^Qx; zGuH}YMfiP~`I4_Y#B43f@59V>zW%`SX!;IZ`Mq${wHU{1W<^*A?OdGe??;I|&aS@d zis2~;J0@YS!32K*$-?JGU1A2`kA6r#7w7s1k{pf&ChG@4JkqriQJboZ!}ttY3rrK( zjI2YZ1dbQPihPUw2uv3Q{-xp3cvWEsf5Tq)?ZIuI?B^K3@t@PkS;nYPUs2_p92~r=)(7+Z!8Y0|a zIq;E~?iTS;Y^!h@BcGzy1U?p|SA-kj1-6OlzLEJ1^b_F>iHxPSPX!qsxt=Z%!}N~r20mX3nK>*`BsqmkzovUryvU=kJ9V!1X-v>D{0{e<3Z%0U+uhR z=&Z%T>YLz?DceDrvK^Eu+d-Lmki=$l{Bk$g?hME%d8_jqlxLSb(Uhf~rY!9=)zZ$u zy{Nxd!*a;P8=-2gV|j{mX{WWG`5A9Z@MRiFe1MzY&krh)&xrKL?n!9v6FZ3v@cUpa zTX0)zAZ_6*`WamK+OYv;8C&V(P<}!5bZi6KEVF?We=cP%GE3hLlb)TYD?#}#mog1y zQs16SxfBVEMN>IiORGR(Z|~Xpm6l)2p(Mx9@{2lS%%2)tB==)Xp4yjMLh3{NQY#q8 zdpxR&d9soI-Rw~vyJuH`y2PVe2$A1}qBQ82=Xh1HgMRX>KG*ZqowPSWe-q;&@SycB zl+()v{=?^7RaYD-`t}BFSYAGJZS>f?6`jN-bb4QE(qSz#9w@`riY{&qk;^E8 zF9DpbS{QQ6XMv6f&`yP}ch*|I1QJuB(IM4onGGPlMnl=L$R%E(u%4ZaXz~gL^z5{@ zSUrL(ARH@s<*$rHkV z#bvF=t@$j3yMQ@oAy6W?1h?I|L<~=RUy;wwIWT}^;qw)`W5yo_?3{%_GS5Pofd9@} z2#-O2x7@S3qdS-XCbVDm^urg1j*-~g`gCivk*kVJqv+|cNPK>?<@o&G50J4 zBHmdDM7*;Qh=cmY_}I}2efd}+j42h^a?QX+5`0<)i93l2WBl70)0 zvk)jxUBPh{0&{4Fi#MNz!1v}UeSZjB4_^iLUS}cr?)8JdYA)!`_5n&XRL#==FV8~o zsk0Ec4Tq8s*I_Ht|L!aVA78138@Ml8fJ!_I;THUN&O%_U+_Mk}yJsN~#-|X}J)E$6 z76M`SECfc+Jqv-bdlrI3+c^t?uzMB)VfQQq!iAboorQqyPvtCxc1RuPEChz*o`pcz zJqv-bdlmv=_bdd$?pX+g-Lnt~yJsN~cF#f}?4E@{xJvV>vk+F$7o3H_U0|HE5Xje@ zvk(ZoXCV-F&q5&Vo`pczJqv;HOlm%L7D5AT@+^e!Jlm@%>)3vRuzMB)VfQQq!tPlJ zgx#|c2)kz?5YA}67%YchU5vYX7QzAOYMiqW2&zwD!f&$(xMv~c19s0sV9nuK2rSvY zM{o;&`zx$v%mrYm!WZd02ZsLTi3qaSMWlg4Z|6h=+H_7tpqtK#2sBbSyaT$!IU$yQ z{<66ArXAoEwW}2lVXkK`mLbAvB3Xz@pW?$Y-Kx(Gu}BZ$Bv8iePJ>%HkeU`^IQ)SN zgQY0O%HXsR4Njm!;b{z^k6556Fo=%!MEi*7gFMe+fvmP~06*>d*7ni>n74Yg8n zxm?sRlT>my?Zp3vE}q~!>$^Mo`{s1t>_)t?*O4o~P?ixFaQotTtca)el( zl}}qdp~dYW^jeNkS5N3QPv{p4tj}L^$Cu^^-Qfu> z^@OI-@k?`rHh4mpdP0jRG&e_x$)S9j>j|x;(3Bh@ZfvcDrg%adnJpu8gbwh8MtVXv zEj@*l#T*K97|T7wZV`Gaz!ZO-<>F{YZ;cFBdKF`Y_z#+XT5x@M*-gZrQP`-m!OthS^RjEDeCz$__@|JR_p8!eH>EZ{Ebxiltb z0i4gJF+bbvLt|+A~?4DayMM;uM@9UHkF zeoC$Yx2Ppc>kfZENdFF8#o!x1+r|sappr4!;}mN2XM-34(TT^cUT_;ExFt|1noomD z@-5)Sy=sBKDw^LDf0X>!1dpRwssLY?06PM&jN!q9KWTp7^;hw8G%glwsb|F|-?8t?)|b_%@R{{$>k&=pu$n@?4*`nauHMIdIA2Z6ta1$nDexMx+}JbUi2%0TM+7#B<#XxeDW2ulV%f@f)9w_p%o%nS_c@|k z&JtDFiiy?DQynj=!#ve)qFN8pGMW51M7+>Puo!6vqNI9&R@i_xQMbg@Y~f>W!xD}>~N|~sAeB^xy zym$@qzCLDl8g;6;hWOz=4)FLoS|va~AJgt+*13$yp>;_oR^zY%f-`KXhe6dph7AVB zam1Ar+O7YDnFdPgO=CQv-MS-Gcr^ojMR&(-)gpMe=lUxmcp-w$f`iF@OVb&?*F~C`#=5CZd6B<)caWN<^7$%W-aRRzkYw`AIMV+bKl?j2Xp<( zfBXI}kl~vJ`Su{hS7h=MFHp;uf)*!OWe66i<10anFW*A_a0{Dx#vO8CPNaQ3YR_GI z7HyR#?}CiG^;#g=$Y#_t;~wG6i)`-zWVvu|wxiU!SLx_BA2p2?N=di(uLHJHY3Vj! z?HKndHQm0Ry!(}&Ve=J^@c{Y-1ZG4JAEFr#>SO7K&*p0zoQH56u$?}eXCfI7>vSB; zO!N4k?&i0`4KMm)_~*Qp%wr5`PaygN=1gVbjuq$JuAhi)5c4hokkh;irift04 zK5`zBw*_g4aNKXaBS^Oh54$qn)kh$l#>h|T@{IQ+3VkC($a!Co0TFz&s~I2YCqZmT zgoj-joApb9j8kReL;VUMvm?E!^Ec6%o8Vzr#uh=&itw;2<0C=lMZO`jRXn&b!o#kN zj|G`8@A`~w`Z8EspfdIo;b=~I_*Cc8anrE#XyP-m*J#*0?8^9DuwI6J0(oBu*4I#l zWxF^yz_5APmGPz69Aemfv1fcGyy1q;!>)|4g*V!;dDxY)L$I-i&BLyYzY8|bu=yBg zd?VOI!{%XE#^j3vllP-wO@__Gu8f}qyV!+I4d z-Yij4yz$j3%WWPD>=2iT$&NFZiT}%NhdXMM2C2*AN(M z1yO4VaN08?WMd^Y#s>!Wn1%6zT4S+)4J~Ea#9ZrFm6S^pj3s`WH4{Szp|oBnh!xq7 zE!g#f*pc6;vs92+B+a^igCNOBV`m^uf@C6PlS|%d`og+gHaLYOWG6{HU#@Iaq`;YhOfm{isfq|mZ22iodgGvEPT#mNs8hX z45zD7T-XpCNV1``gRxd}9>tu8!IG99)_b_7yRV*G#6op^XO;QONVNW)*hgrY(Qq**_~8AtkLs3-1#^9{cm4!ha295OsWw{5?;s5Oz{_ldYMO2lQAHgnbrKk)%vL8aYAvc5yz0K_oo=5AI2=Of@laZ5G*qTFY!(E5?6UXq5 zxtcGb_0MSbx+3?b_XUvLZwmE=QH$`}&PQ5MA`4~xi|qA4j|9EtrHJ+Ipj)6Db~t-0 z@cCe5xxrNv0Q_pU)A{!Zsu;bD0NUb1L-`45^Ij1$CRuyq$HRQhcO78m73wf6^rkk5 z>wZ#)USSP*5P`LA>BLVY-pX=Y!;PTtZSAU{mt06%%~%wK^(yAYQ?xDxziEP_K=DmHBBy-2gW6pnwckY@DZ`{b321G~L-nEU zu4L$Uk#`Sx?OA>fbW&Ac*@1iB_9V(;e1AS{XAcBv4Mel;0c-|PSplGm60NwiRj>xY zPypQt90TBJ09ZZA3_BjSvSO=}`6YQZQ`j|Je4t;Mgn-H_=KFq9A+Mx&O^|9kj`4OS zuF0MNbPeboU0SQtLD>RItBU{xYZDAvjH zG0vScq;`@AkIr<$h1nti9)axZ%=W;6yDq0py~uZ6LwXkl-$WRJ~ki9 zvLbY5COOQ`%pnI>mJ4$%7v)$kb}XM#2ZcRBi6YavGfO83ECO1Wi^<&{^s$*&obAHt zyg$9$E^1mQKclcw*aPSL9_zqyMiJVkGE9Rzvo%Z6Z=JyM0|tLT91Nps zHR|3=Uk(9t@1-w3wU_)TGWJ>pGmVtJjyXP4D7mX(d~3VFrD=Q)|I?K)NCC}%D{cYa zeB4*otQtU&t6hNf!P=E+2=s){xJEU0@)|k&<8%&(0WH^}vH;Fm3z|X0)gu!3SFi zVnz)j89^)?D;k4^0^3|K8Y~hx7F~$B_h7Lg$>@zlN(9Mhc|(Ym8r%*cUuOzgNMz}ju$SfF1xW`JsRsm1b3?E9mU9fo!;NFB|1>D3ld>DO87I53n@ZqH6 z6@Cvg`cD8uITz`?6Y#(Mw!?Yd{t9H|+m6UO+Oar5jjU%WkZ(I8FVjf!TE=Y_efRr5 zSxz_CN}J4VuQiSf5$|FYXaZ-r`ywumBudg5y}KVrBYt3+{=W6 zDKBEKiKk#p}@@EF<| zX|U8~OWbYK?gYE&K{`27Y_&%hrRJtb3w|W(}L+yRpOQMBs={l zY$=G4;DVAZybYo1TZQ@|Qck7P2tQ&XZ+W%}=XAtG%l^Q?o`pJUg#>g4#9BO|sH#+G z*~vuNUbsRxc|!N;u22(&+K7;ayWUibVMKAaK>+s?q3f7*w80?C39LaHZUch2^Ywwy z$o%J@&_b{VIV{-pYzV+qmqcXz979^gMNF+PnJoOBg-dVZlBCKvg+ZS`hdY&0{J$jH zwH;6?|6j7yoDQ@~QtNB6BEGTrUZniMR%^;%)*_tAC_%e4R*NT_Y2qHs9o>VBR>4CD z_1kH9K5}h7NO}`%n{w}V`V(*Ox+iE~qT=4|bnjfCt;D@MX=NSI@`qrGC8-MxAtWhH z&A!_} z-`$4qS$IV@RVPu|c-i+D8mBu=Z64mexji|W(i0G?g|N-v@Izt1*#qnU=hdr$1qeT9 z39J7W;;N%Q2B7~z-1h06SAgX7&g6!gaQhZl_&MCrJAZ_KPVY>z@VWhy@X&b-b^3b&W`%XC2DHtya9dsuCC)f#x4lV?!CD;jv zy3=_~+!5}vgx)6D35O0P-A=GBhk6r^$xhm#!{}R5_RbC+t|Bg-aHzkWrWXr$c!uFD zMP&?kWX@?~FMI%DGr=RW!`%p52_BIh?oJphgLy=DxF`1%iD$!ybw;H~*zhBKxUz8( z-WrAnC>w1_AFOP2CVi;bNVFh*1mRdBN&0BQ$;437#}dvY#u7f3aEa!74Rt4c{04-n z5b@IgNH*P;|v}ce`oMOlg{9QMl2aTjAWV@41h2CZXYH1%ivPGh$LG!bILk! znvesBUqx~>a4p@90-t!Q7?44=;6qZ^`BrO{fX{)*`7FAL`i8YsAnqIddO z0Qu{NOK;-a6BYKIV)`kFCM9fzzfWJJA-r2Oe+1q_^wG%RI9b)F7Fb_Sunt1 zLZ9#18YGhU{kg4EsZs6OsuEl0dA6#>)@z=vwj%lSpV~@aN?UO+uT&fhexkQu8*T

HEu~0VlPX_+H2!N59!CaoJHV9hL$D&R^f;6Fjw@WrD?NZ0=ihuXK2N{DR7<<15J&?exzA3bDo%~ch%ZM zBuuph7;qj)H8n?yU{JUxp}$LhqNs#NK#h5!G0_G18ue2EX0!m@jHHw@O92dr5(>HA zsFH*vpxh<|-`%odYB`Z9-BNe+^l>O+vuH2emO8^d1>vgFTrQIDxPGwMOQhuNPLfr_s4nEI zFLFtiU?#bIe9}Rq*r7|=YoqXsT-?wije6i0A3Il@$K?cm^KFEJX7dxWz#c(No5$q@ zeiy{DOA=7vN zfigi%`}2c=v=qd$Pp4Q`oU-jZ$SD_2%s#jgNQEFtyYe6)m4amK{fJZvQevOl4M;07 zkhPDcwbp`E*^e>MHX>GSkEBkuAhq^2)Y(svI{VTCfV35)-rkQ$jUWy7Sb9(^NH?3u zW(V4d=|=lT8fY(^UUof^4(1jlO<(&<23jYa3$^?U=}$-VYouN*8`$4G4Q-`e%vc^E zBAWdv{W?(0n)cV^93&hkWx5H+wwuT~SU53z68$)F2a6|@`sDO6M8=<^b=^dzi^z;2RNa}825p~iP{?>9!uCv^E@VN z9APWX^O&p&gzYrXW3na@j-|7x4AvCF$u!SnvW_R5N%K4=YX;$xG|ywQP9&U7pTw|c z60S<~D+6m5;p#NcW3pxwu1)hiChJtfb(-&=sN&XXj6$l!I{g`TEj*9OI+HQf(mapJ zI)|{H=6Oukd4!EL&ttMKBO3YN&tnQTY=ESn;*M&!wm~S#c}xj8k0~MNF(uS_Og^5+6zbuJ zj3eJ`5aq{6?%IenCV+WRQ)t9Ts8c>3)D)6j_VJ*m&?qKg#xz6Y%Fwl@xkx%RfuNRt z9m9ao#4)gDrg>0PXwt19H>7z`Q)n_*Sad6V5V;zfLiks`kaN7DsVs=AeT6)zDKw35 zA=dZ`IpZ5To=xGizCs>86q-H)ZQqN&LLSr{$f14Ea<7 zb!Qqcy9czzNGZ%T=^b0@Lw&PfM4Xc*(;{gymy5Qefz_`G(%qZ0n)R!=I{-s& zx;qX5D0i=sp};G^mAgxVbhmha*WK%cFSxjSz2N7QFAgsi{5jxdFCn;p!r{L<4$qO9 zwNt^_4i2O8g~!p#c7evI@T+kzI&%=6vPMLbcDSI75pT9L&WV1PeRZ<)9i6@8wW8U~ zp)ryeC1u!DP!eO0ml$ItG13igVvLc<90j~o^6n@}41IK|Z8ji&D8XxgEVt5 zM9XCZ#bboo8{w6_${aXW@Y9L!Vm6Nx{8r%Ex$xv>#GJm)#T|Q<;yz3!LX##dWyN%s zlpaAg1^n@!-qZmjca@1f#P3I8Osfdvu2)GEDGH|`I>8gI647@cR7v&mz;Jw?PFK+MrcXT`pXg*zhKmnoe0}mA`Xt~I?u)P?z?)+1 zJSNdc0T$AW_d|am#`eb(jEdh!0T$Bbp0ST)w7na+r2WSMigri$Rk#q~t6Lu)(+kxcIPGd zI$l(ldaC0^brW%Md%U>)58%q}@!~`W7!|iCirZHKtvug#y9t1D`+a1ceyD`Ksg0Z8 zT$7^m`%nq{Gbk&!50$V>kXmB9x7Z#DwDLfhv?V1pMyG|C914>vr|;3uUDEYkN}?%UyBQNXY*2!E9C&3vh*wEec#4Srv!AsgKqBnwO|3EDQmON^ zpS9tA>QsPTCptVf1RugtXIpDm=SWXyhv>w5KxYrw-Kf)AhY5V^2GDu6buQ%FNH4ZQ z|k!5nIkmZ6FSoqT7}xB&&Uxv-4mMO2^~aBN9PE! z%TgX5?Fr3cGzR4ez2FHA@`M(%t?Zs7#O_R4>h1`szqaJr@NkBLjBD!d0qd8%)FSoD_?m$#b=Z+oayeIN0$tDFY3EDc}#!tI@i zoa(Bz%GRI_2d%Qs1^T$aNEevs0yAA;kpq;y2w)u4`=TwRN%o}}9BGvsT+#Pj;Byzi z=6xzi?4zTA1{dh#0>fQkE`aF>pll(4?nuUmb3lW!O^8;)6;8WtrJ|8hr(g zwYs%KL&IA(0JK*i*Tlc;AycAbxn^&uGcq6tB5 zEljz!^*X7oH=u%4js=@@N|oaQd_v$<0IJEi*@#^xR+1pL6)Ph>E0>9tjkHn+Hk4LVsTN%&ZMzM z7;B4G>g**5>T)2Jc`a2UmDK_G1<~VCpKf943mW4#%%RPOD?>pG;xU#-$2&!O3rGbZ zozbjXxf?Vlb=HQPEx~l%tQm?1otO2TUegKxd0CI^HQkXGysRyHje)4}vi_#mOhbnA zvL4WDUO~6Q%X(0+*^K|Ztf%yv&XDD0J*n4x1$(@#ReH_Kpz*RE(`!~hmY4OgUUMQc zhnMw`Ub7Cid0DIVn)jf`%X(U`*^U3atTlSg2e84*dO@!l09jtvi+XMEM(oUqD{@fH zw`kpYS!?y0B1D6i^^#t5B>wZV@Hy63P~&B-*J~btXGkVQRxX8=8SFbr8zVNc{(Q8hC9xv-Y zy~YO`FAHDAb;5sMkp?Y@CfC%s`>OM*U=6yc6HrPTQEd1-`3Pi5&a#RB!LJJb{i}f# zDvtYVzz^7YH9&IkE+j-3mycHit;koe21u6Y(h)A-c{MP}#hq6Jb6nhgHNX!c|0lc} z*n-Ia7q12w-~V;52AG=v;?)3O0l2RQ2ur5rX?~_>zVm8;iS5h?$MpRXfnasehnX#z z5su4@a9n1D<9p2rZ-WU(zH<%bWkxu@*Nkui^n_VpvMEhs%J&oCshla_RL+!dDrd?! zl{4j=%9-*_Wzk$ZQ@*L3Dc@Aily53$$~ToW<(qoF2)b&@HQAP8 zzkz~E|4^qj@G~w`zHyoIjmwm8d=O&ni%&qBnVK`@y9kngiaV;^zNe~8`Nn0+H$Jft z#UZ}el<#ZJ^1agNJL59t8+WFBH#edOKJ2$Re6$Omg4>}8dGDFyb3j!Y5bk^mxN(^|j?2t(TxO2rd(9jV zg3Q02Ii``qg^d`_JcQ7l$8Bx`S|p>ShY0FJicdIY3M804ctkER=~yBAX8o2KZQU^# z=l7M?ExB5^Fyo!zyitfeipnfvvS>R{O zd#H67wRT}TtFLG&9}lC(aA=fXB{FQC=6D7U69YrD7y=$n&b8o_Pp6=~8h;ijwl7Ce zre?RsU9B2OAF74|bDg0;WW@jGp@4h@VNAOm&iuy(1h+!y&({tF){xb_b|CN?aefBj z>vld(J9~wa{5vjdJ8sQmgZ03iWdoE5uEedi?ucQp&@^CYY(TQ``?&m|=I=_r8XJ%t zDG4NvCjiL8%Rt(A5BAi;%Rmc3)WXX^Mi5ze87LH37G4I51Xc?#1I2=cB8#3<_)X$a2h&jSxL8%5z=w$E8z*8%oz2FH#G=k-<3y5CXR~o4nW(ebILkpv)Y)vDoNRPY zCBpeY!l{Znn~i@9PIYuEJ@`;Kbx~)taq84Zoz2FHG(`F7CpH_W>26VHvvG17qt0gI zM0!QJBLy}ar|G^?XR~o~hD67<0q0W*XL$7bY9OBpGCJyPHcr!Hqt0gI)EO5|pmJlg zaUv6=&Sv8@JvI6y9)+>lI62;C<3wgh`3eb}jZk}TIg=`K!a5CuoEF^x8qB4m4S6}m3 z?V2Ey$b>qS`tj<%4J?H^GAXoz$IzaI>Is_#hmgKMVXNR!!Uqzz3;Gg1m~gCMAmK*B z*pu_9UO*0emA31`^%v3h2jGXhlCKr4B76X0vtTIUZiKCZ#e};PwhNv^_~D*}V+DU9 zy*J@xa>#%ITDULW#k=oGWb~^Bl1PRJzs+z?M9|?QD618`LwGo0v)~tsjv{Oo6c9d= zuw76VWR-LH7D(WrJ1!s;%l7UJXGdhJPGrQFKI7}Q$jn5~Z;PFh9kl+Ak52Ko376jV4m3-@Am=^dZ0QaBe#TAV$v(g< zn(_X`LzI7CDe3x!&eXDU-LuZbtPe5MoL|*du$&o1cIkRZ~KUr{_yUN!8hpqGdgQvj` z#;$`6{QFN^=Lgg(+XYaORkeZI0RWq~&JX;Dt@EAXaIhkL7xZK}Z1r0KP?jX@24Jnm zEqCjD>pyIrZw)L$<^~^w+JOK>9|xt$Uij6aVaC%S%0X$N5%Qs@Iw&nPQV?}eT4Y%jHXhGCLX`wNKsDsi%M+%}2N(&t&h&m`OG*%FGP+I6{gN``k)6g+ScVLmlp*M_q zsKilxk{o(V#5J3v%FsqZOq-+1&|d|yut*kSn*_0Kjw(ZM3lg(Astmm&NYdu0GW4z> z8JnZZ(0c}xv&818GW5Q1vNlJRp$`P9vN@^@Z8lzjShc;C9(*XAI-8@)(BA~9w>hc| zZ4snFHa81>B&NIB994$43a8QLs511iAiZRtv(Pp%-Ph)*GW3aXhS(fchCUT!xXn>z z=rch^%l>Df&&Bju`&x>9A)IkGN0p)Nf=ra{twLXl>8UnHm7%YMGc(E~Y(ifPGFx`K z3hfZFxi&|Yp}z}fp3PBZ=o>*Uv^lB_eJjX(o1@CmPC*vf994$C6T}%+hJL^fXYQ~h z{Nx=zba=r&NWED9p=e_?AJ3i-uUP>4UZcuL=MO0=(-kq9u87HWMJ#8!BGT{}WMl*r zS;r#$#~sRPB%U!F$Dln=aEN90WDaWu9AcTh37Z8RR+&b&= z+W?3YU0u6p89QAk{sCr*%gA-2U$d|{VGV$wOZ1%BhJa>55>-jlx86i2f`~yego}Rx zuRVcp0bu7a<-{!4Zc?8^aVGL`FiTuUt`iqG3ya_s3c5tki2<;GtLwy$DrA50$snBp z;o?aEE+;Ssz|8<8C2n`^exdJnop_kGT}G}Gk2ed86E9KFC3;RU6^<6{g1f%vo zgkV`&E8STb*q_H&9h#0HH(DFF!#8cXMgExw)Zr{XataP zc*F`|cq88S^fc38LPgUrs3eo#j`TEfaFx=$l&=>>^LS6Qy{mcI(XQq>p5}qB=E5^v z%|)JOA6N6LC9dXOp5{&1KvmQoQ}#(>&GHyeWbx zN<4q@G|zW6@2Dn|`58k&QTcg=t9fT{SF^P+nJY_O%@yNa&2FCNov!A}b6w4$o+eJm zRB8KgldCzE%yQ=E)2`+t70eL~R<+7SD6dA;@G;n`{S>kSJS=xZKY*PweQZD#XN&Bi ztX1asf$kZGkM*;Poe2;Y>{im@oncVFN;)tFYn8KL*lcI`*aRt!b~zgDax@gIRqmq3 zXS$Dlh|>5>Zw})#@uW&ROa*I|E2yzd_p!n%jb%9+%an$6y$aSUJ5pnm?qln$G)9R= z)o#XVl+ut6TESXnni>h+$5u>fByz$?C=KcA6|A-9_R&6P`{*ie9qk}(?#H4fpR;we zHV}Qesf}%myLxn(a=3bQh%uk=TX!rnBj?fK|MpY2oJR+2FmxBZ|6h6P*5cqB##Rib zWVaw^XddOzJm?I~Wx_Y;49(?q$)GbdmkHmXGc=b8-=H%zmkHmXGc=b8-=H%zmkHmX zGc=b8-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8 z-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8-=H%zmkHmXGc=b8-=H%z zm(wMK&d^*Ye1p!=Tqb;j&d^*Ye1p!=Tqb;j&d^*Ye1p!=Tqb;jdkxKlKNx(@bGCPQ z(vQCHk3(~7%?^3AHTOq@qC`WTdB)biADV|6T0lmI=Aq`Hd1yVGBAHway-XwW;L4rj z<-yaZ`KJPo7c;~I|y`Vo6&KfUhg@5>mpuh6(9rQ2$ zy@Lk+GZrKACqe(>$El735Y`J`(6EW1hxy%DuNBTtFKC75V|CHqvEHyx&>!p*H1LAl zSOeeTxFV_c0bCi}4`JWtxiVT@+2Xl!hj1zpw8{X5_xyt^%lC2RNq>4{ZcxA<&rJp3 zSM7~!$s^EV>KAyfs0MZy{BxuWnne{kipeOy_(k1N3M%?%oh#FH_Wg^6C! zDnmZ?f}Sj#OTC~Ke)k`Op1x1eXYLa;@U^)?17Ef`t|eD6720^NG)jgXi>jnjVL#!l z_FPf;=0CX7ejis3@u!b-$^xRL>A(+ja8ym=TCy*Tr6mFUgt2@t37VTQtDwWe`PK_s z;dz)akYY&{DOUL^XzTxD?@geisMdDjnz~czuB6jRy3+}PBxE2Y0m3AR91VgB$~>b% zPys=iL{L;j#0eFTpg2cC1VP0CMR6Vw0r5C62qG$|sGxv2Pk8*F=iOD6j(X0$|61RF z?^^#NYgOlc_B-yOs;hSIdUs0~7bw@+z~UNsAY3;A7S{!Ey#wFm`oArnjJshcA+BRE zm%}TH%V|nio3YrEB62e6P<@fA--+r5U$w8VsyLXT(&D?IN)b{05pVY$;NagYs*m}q z*He|(G?z1qs{5fz5mEgLsyFa*v_Vumqasxj@Y_(0eaCn<3g;@S{sPrwy|#GMN(=_g z{?xKRW>+s4NkGZwpx5zHAg2Y#qvE^_8?i;i4~pckwAmv0w0_iLb74Dkd}MdwWpm!2 zY+gv4zcVhy$sGWjt0{StNDcsw?@Attw<(*vCTZE@I4;zFD|FNmhhAsko-1c}J!cAS zeoY^a*!&1McWv^J%e0soKkr?XWe9~E0Q+@=icu+gFQ_@Xr2n4ywxas1xziT#c3k^N&kLh#ycfr zyfdGDTz9Cw@+Zg4^qkXzAt}yQ*owVI{HjRS41(iNk{!QpZlUAvP<8>Be`OMIS4zRFOV#8^ju2c!HV^K|Isars-u zU=-wPE>~J;hB<@WD9Vb-ZP;0t{VC9E{w7cfohOr)z2s#0`$?W(0JWEK=yf+Eik#+* zP;riio7g?9+b<$H7dW?ba>Tls0iC>FC_5}MH5js%+3>Uon+>(wn!P>k$Ph%(u&Iyw zllDJUjrjE=72%D65DiL@zKB&@>sM{MRINiAt5(lx3V*R~r$BO@NPY{Pd#YPCj0a7B z%lL}Hor|&#Lm6B!j!*o_fZSv>9FXrB4F~KlLqcO?3&E?O5WIqF*%R5Qi~Jbdp$zHn z7~|uNNpVhw+n7PTSR|hU&c*i4@+VO|Xxs>$ygN|#E|`D13O%f1*o@0Hu8ypGYu}@q zRjrD^V=B)M#o0@bCvpI^70C(1;Bk6#haY3;>F{_h$_C+AA+2F69B(v~?q{^}q{seM zdgz~|&o+j8(wF>Idg7m?XBpRf(*OLc^fmvj{S$0KziWJ=K_C5(%V7B`FYim_Sv$X4 zv+HDz?duG5!N>KSdr_AdXY};@MY8NPbiu7??oLp_fMnLmE75Iv%TVUc}KEc<%*pp6Ir_fvv$BaZR{7UzX1R>os3ItD~#5o@8DUW#8lX=mT zS?jSfU{mZM{k5`#oL$OJ6OVO{M@;l&rg$>bT^8<2c^2hL$IQV^!vg8T$1~A|H}~{8 zLs7RF=c4sSBKaY3?kaQ_Hdj;)QLLX7MKivJvR8+DUAPro>B0)tjGueBwJzGfdfGKQ zGlh%xHeb7{m8*S{(mvM1y_I%Lt zU;86Z`U<6e$ivs^iM5DYntlTa>B4`3;4N%ov&YJZyvQJ%r;;fFA>CZzu`ck4i#?f{ zAjHm<9_uZS*zCz{10i-ka9LU-{>r9fsvFJ=c{@C$d02iIy%FYAsc`MgYe zHJgqj2)ST4!LF#{1aXl!-gd!vSVdVq1e-DigOrWj>bY4Y$BNNf~`3HjB8vl0nKX+ za73s0IdZDQ0(f6pGN-;kE1t?~6e%umfJ^S8t}4)qJJLm_;_}w8gbStJ0hU z{aA@bW2!(ao<;7DA@R$5xsqF0M^&H|uVc0LDlYGvN>Uk>D$t6*>Itw_ae3=eawa=P z6==m1DEhqO@+-LHOp2=ltvH)OtWaEjJCtmtt}4)qhtcm`#pQ*k6(}tx2-zk_ zd&%2f1<-)jG?hAsQp8$WJDUCgOT%}Cc!PCy6+YF3@~+-$Lb*CjE&O(N4kVK%l&!y6 ziz3P2tiL3Gv;LC&&H8_p{4JoCrQC)nWbJmKKJQzgiubR<$I0T_?LhT7;x+j27HpH= zhePEcQF-2iO+zoBNT!)nPNqc4Vti!a5+!0-p@OTDTCknclf}a4&71JCV7rifF4#`# z#p3V+`)vb>$z__^-Xx2{G?`|$Hw&<2n%UkWK&>mbw+c|}itTp=sCC8mHUVl~vAtb@ zT32kpXE0o~uGroo9JQ|4eqVrES8VSzc0jCLrkU*zgrn9K+aC&0>x%7<1gLez_AW84 z))m{kg`?IL+aC*1>x%79#I#yhY=0^owXWFSBS5Vywm%b~))m{Ii)pp4*#1H|YF)9t zSAbeqZ0{4(YF)AYrEt``V*4urYF)9tU&Pe9V*7w_)VgB(pa8Y5*#268T32iz5}?)< z+usOqSAf{x88z&|D*H|IE_A4@F}L5A6^sOJ@M^UHt}$<`*_#B|&hh>GV>AeG(q^V% zXlxOXk@h~$YkRAJY^Q%eh`lQy;q<_27F(^@%y)WVD#qR}oIH{nxqh)EAbayumV+P}`puf;Exrkpierh%%Oy(wvBPD7mL0Md5mE|w1^?PNB_jjuVJ zbVeqhwaha~XJ;~JhN`C2A_M>a1eZDqc~@>!(q z%nZ_3lg4cNhrIx9xE{K4y6yrYrz_^|-v*tVh%bgnf){acNcZO*jHr(l^`*e>5BH+E2{>;BuC)A1 z;KHg;(XWACqZd$i7)&kyCYNgi=$Gh?xRrSxe#^t-hQ+~|-3JYUMWig@qmo|tCJe+J zG%-p^OU&%2#?LXboecSD+(`2(rPp1Nf*T|Wc_$-22Bw>c@=od=GZObpveMu~s@+Vu zg^lzPTlf>eLWch=%<)%Veg6qTH~O7tK%i(m3O@%E|8V`($CG;%z%Sr7x(Gz#Op2Wd z>RV4NsNYPn5h$w!x6uF)CsQns%OE?o!Ot3Osg645ei{{lJDg%M5Z91M1+kI@w?}&$ zL{rKaw?Od$pyH!J1kZv!tpuC2*&6|wBexXI)fQjwZczyB!lKSv$vJLO6IEnj(}I#I zDBA|jHeT7wTFDHz>?BoYhBQ+vx!P6ciZIwip`(?|b0yF73#+xVJKaJh^)mX4OB3|V zydlOlTYB9bR7&;NW$dqNR77>q<&?`Eg;WCEa*=;BgsnqVd9fK3Q`?OEO&AMTkNj2h-m5&# zwSU!Ive?sn|F4=4yyR&f`m5%O4?NA_Xw>VR*{WCU=*jA?A1zHUs0U0 zhCNs@AD1BG%b-bR#raZhbhL`Is52~JGFrtM7En45P$wENc`7MR)a6_X9dkp#jycwX~cNAGH-=Q@gAGf^x265j}WU;sz>G6@T zfNm#y*vnV&q=74wo67i22>7Xt3H(&X1b!-G0zZ{8fuG8lz)xjN;HNSs@KYHR_^FHu z{8YvSwG3)E+DDWz5?9sf@|-QyG)vr!pqTPi5Q} z*8F@0QfnSGf*L>GCtEnHQiLk6mgRYcd}^KPi0JwpURjVKb0{#ekx-E zKb0|opURjz^{I>xp*tj%@fLb_QyEj<^?tJJeL@XxO-_-wy8Kke%DbD&Sb29-87uFS zJGqa=;aZ={cq05{z&39y_r{9+wE)pd9bE`Pz(BoxP4 zPO)0yWH|3rY`B1I$EMin0^sl=+8$x?9vU?qWj#rUOISEYM6fEI%4Z9(oZSRt1=!9_ zv@}kD_)N)6(2Qo{iBYrrje!MbhaQHT zHa9yo2Zxs(nzWZ4nzWZ4S_Y7t9h!88n;n|8mmQk4mmQk4mmQk4mmQk4mmQk4mmQk4 zmmQk4pB;J?<3*~F-x2TsaCYcr@Z)8NrcWlD?O;9={ZQZ7(5h#9zRzhP{lmsWNdtNZN|Oj=r-WCLM^k zq5PwygK?&`v{#Z&iT_TUs~Ec-|A=;0vpl3STR*E}m((WDtJo#A$%`uXdua1z$|vHR z=<8L|xvH+~D3c#=Px~84qt8fhxJ^}>~jhXz>hxUP4m5O7O&HB=d0Rlns~i}UQ;n* zAW5%Fe6JUZq1T94FskW-KPQ&UIBLQf#H>UgU}brq z+%+#ImZnwDPd@;w*7{14eyBB_O{X#H{bC{SCDI3i%U~_*9B4~J9~3+sxcEwj`L$q8 zXNPJWiA_ipVxk|T1KBYf8<%Q&HOD@$K8YXLArt+o;a(3_8PC$^ySCeWWUvQdO=4{X}wwsGiT0 zp^LAIUn`*ck+0fCRCoHST}ARRaN%IKc{k}XWBv>+@dewn*l*7h#nMsfsJ~o{ip5gn z3AiZo`Upvm4ZWWVsZ{Lt09V;9tGC;OeQ*1Aj}^Q3`F3rwi@gxs%7w(z&AuhawKQI? zBx~>tdNXu+F|bFe5yCQHy%SpUE;h%P0dKt5h_n5^vo8Z2?<-k}XjhR;uEc(My#5MY zEpZ*AzR@?dUku%efuUOCMln=65lL#!8iPzoHwJi@Va%VZnq$6Lss)=@!@$=wyYgDUjF-vQ4Qg%J8!$n0C97Q~(eA~xSZ9g$T|e3~iFO$RP#2qW z3Fuc~Ey3iFdO%bM{zJ1zifZQ!uc84_t)7I6$|WJ-Ch;xp$1xiS@LO2#uWFs5Y7N;u z$+&N;dIM_-CSTOQve+^CaMMxTT@rd8 zANB0NB8sV#f#t&Sip4Qg0jxrORWwf_mamMpg2w|RN!Gbo(Ixms;?Wb3e_!E;fwctF zR_c$6!258WDXt&(T|X+WUxui1{iwM98d$krDViDQd9EK9d>pWrU=~dMZYkIZ(-~s= zXW#VQVtN8qrNI}9WSwtnk>EGP6ccUgH%P&=zNxMVR&~G)Vrrjn>PC@FO!1^%|248iOsIH=_ROmcW zeHXaNBM|p45^WI#^Ni{v#nNowQf8J{pOIqeN8i$!Vkzf*Si1F3mYB&@?!v~^ zpYcsqim6Y?#}%hakTw-3TW=WSE!FEV<=#RyIUQxZ3MF5Gv;@<;>S3|_;xS&D{SLUf zQxSwEf&$nq<2Djui!AT@pC%56fte>KNxI;hf$??C2bu&E#_Ib`UI0eH`l(XCTVO(2 z-*55)@Gca@`hGLn`azk|j7;;ae=WENu$Ew!R^)K`8Fo9vZn@aa!%c&-yG`s~57FG6 z7;TW`73(!%wfn_3lQ$*b0IM!}PfTZCfG@JD0g&He(iYx7MXSCqyq@Ge-VcR41?&A$ zMP57-%&n`hmMT^q?S--)>ME4g63V$yFFJn;?zUD-D06{JFQ%*2rhFOoSAngTz#gWw zTzD1tEnpSsGvfRp@#MbHepUjFTnH?|JtzE5zzkiXUO-xcDSGw65@tz9oP%=X)H?2k zIatCR4^i2|V6gPWON0`~V2QHvbT5vf;^$go>G@%TKLFMeObo1VG1%t=(I8lahg0@d z-_sU@eePW3dfH;J&-)RIr!B^9Fmf-js`0xrVf{U^c-kiT=!=2*CV{@)U{_8BZc^O| zCnFjj1Kj*h@5?(!+4LasPJakKDG@TZ>@=ap-7C>crfmnK*SS;TnICTas z*K%;2>&ILtF>mrMpDUJ|K~yZCE0zZUD$5hZ(hbC7d7|KFfVBjZGV3RZWy_Db5*G^< z^9f>kyJz_Xu^heBvwV_RI)zv)cNcsWu$EwcWxZTFaL-Yi-9%!((zjeLmhbaTRfy`3 zz=d-2T`8J+-#oq~rB?~J$4najodpRAxv;%vr;A};-&Dv6F?=pW)m?l-49x{rt&u0D z9u`wfbFKfTb95eV=WRs6%c3&%o6gbs7FFd5?RT9gxqTUkEm{is=DY5@>TbU zYBPuyG36^Hsd@&mGWEIO*q4l<6su~qqCFjUld0rH4#ninJRX3V#u_=(;XsWM) z_M-S6Ez1Z!N-XEjQfGY!K_>v^-wNAo|925&{bj$cmVXZztn|SKj2bO}1sH5t1F^VY z9Qm7FD~^A5lrtH>(V(NDA95Ka-1Z65HruIWs zYtAg*`mY=abA3sp5pMG2&hb}{gS5*j$n@a)G72ujLKgK_`*9O=Dqq;Ao^3}YHjd!jWy)vtM_gVe8i zd)ZR>>wXdX-bxv0;9t^@dcjI`5lU?M(F`MSgU){`rvjOiF*Jj{PA4O2r_x}b$x`y4 zb10c#z(`7>EyMzIX=n-zrSSV#t52SkQaze@1%+1Q!&{%0VZUMqp>IEf+S{+1c>+iSv4mn@nnF8`Ohi>~Gf7j(eG}XcR{*$gg4;~e6ms7Lx0(7gbP%$+f33F za^D2EnWQP?z6owK^=D|Gm>z3C%Lv>z!Bd%}DdfHhZa2dGPiVi0O}Ck(DdfHhZr{(Q za^D2EnWQP?z6owKNmIyu6WnH!rjYk0c&L~bzBAfj2t;(AyWwZkEKD~4B}r5Gh3`$A zR<`>lI7OYd-6;BBSHC$O3m}tTgAZptPrmfmNN(V{l3qdbbsC8}ff0A(eUHbASdWkj5`KV+R9FnXL3Ke3yF6yBWAh>1C0=OzAQ2X5cDUkMHXRu3rv$ zISmhikh2*p*mi@K6>L^Di`5FYmm#m;ZLmT3w;YFFSA%|v$!nW;%iBavuK-@5B+07< zj>{^qg`zo+coZ(5?)y*cfO8_azVZ*9sp+eX9K*%*ggej#Gjs6I!J$8A+#SFd6LSH5 z24yXAelquY<2iC?q0G7x+?+8k*QV|ZMxsr!^sB}`N;7d!g3<{tl;fX7vermJ4RT9S z)`47nA0l5KinxbrBQ-zom$j-d%ctB%d=t4cT4Rg7l5MhCF7_KxePQ1VJ=H)ngfkeP z8aBXXM$Utb2Y;}Fjp2-()ya6Sp=Do0)2I1weic%#?n{`C-GtHMaxRDICTrRDr(tam z{`HHWPc&Tg7K4jOIqtHrVDV<%>+0^fcIb6?q`;iK7ra?sdHDniD)Ox&IqoXpOQ^X` z_zQq@#<`J7^Y79dV#mnguNVA-S4>>#iFq!TuI_HkfzRB#QC5021ahu$xd>j99B>Ykh4D`Uzf;e7CVAxCr{^%!3;!6gzD#c@zZ~z(xK)Xh|EN9}G3PSV*FqT2 z-3Q`v5+8zijl?DppMlVF*0_eHg%;|CDARb2myyWPB&*dhIxoQZ>xX?c)#PXZ1D$v( z#0zTKY<>J@8-+5xjw4nzOCM>L-{4L)OJ8Z0nmJyx^cT(X#L_GSq*)dN=iHFoEVX*h zoypB`y55jKqP`h28NwL-X2c-P@Ft8&Gki^g&0t*XHbYYoS|N^x)qV!5IN^|rwd8xR zrgA2FHAhQmMY~w@qxDso9F+#F`x z*d4%q7pK{K(6JtJOkP~eKY$JZb;|iA1Am6Y+_c59=0)uj0>`gkhEY+gfR1&B08x;VwGcoK~o z&~>w%odZIe;CEFhO{g6mgQ%9<4xj37|7S=}KudK@V-suIJu}fSNw@j`XV&hyHyZ)V z{2iyd>2Sc9eK5kUsxwJmjfXsI3d!JP2n0s!^FXIq*8ThO-`>btEq{gNUOcH<53m#o z#_@3&M~EM$_n;8At@}!F(Rbd*d1)<`vFW^(4f?@1A%}fU7RK@KArms@S9mP29$iHJ z-H0I=p9(VVVrV9Ut!}54PY`9WHAyXf#JO6q4Gmh(#dwTXwC$`$Op11#v$H%pBYnhl zE!g%RXl82>iyMQaG9&6EI3!{?Dn?~Xf*qO}aI`N2nn$Z}KS2P&PRi2@q>mwOJ6+Ha z!Oo-|=b{|Y{~(Q5+!@WWq_dsbls}Gi!ePdnU=8Vf=OAhw>_WN_Z|}pItp`s&o1VFS zZtxV6n)4(g3ic#DEBXT-{erz2v!+L1VmtIBz%Q_=_n_=T2uVc>v^4HGIyX3I70pSD z4JN5Mmok7MbZR*#FtDNAN62>GVMT^*0zC(9LrbY#=)l7@8L{30$c$KQoV2zG#STt8 z4B8pVa4#UKIS=9t3tlMpVTS`Etr6IT!8^vA?6ApN@J^9TA2CG>-X((RBQC__CP~{V zWvAaQx4_PIw0jTf^z;#Dj?sb(x5GzXyv7xbV2^NciT6EBPXt6A|RGNcYj}1P#85NaYdaAycR@e8^ z(@DMbOj0jBo779sCH2ztNxk%v^pbNjN8PLUphF6smsru)48&aG+{@EveHG|(C%~TC z$Op$N=MZc8#yOy?(??7@QwzRD`|UuZmEUHRok3$Ty+dC$4zu$Fw@ik7H)kySXzMJ{ zC#8=V58dt5?e1`DE%-j=`#LXBe&<7=2Rh{}|D+YpsiDqOjBO7uT(!<>+WCy~qqH3U z<9JB0J_%MNA&}*0(jURXEKLbO7U_t^HWjTh1d^mB(AD}~B$-?%=P78i>PeC;O1P43 zC_|b}QZEBPgHa&YU{+YpT0`M^9!4#mVs#6Um<9v-E(``ISgdaXKPFd+QlYijI5tF? zj7=+6$lhosqsfLF4zY+uo7vM~ED=0TFGzub?QEnPp|#j#j`S`9g0Tw-j+ZrsPV7U9 zouJP~4Kg$?+0j}-+YLASL5OAqhhncFSbT&-)?n+Dq|=(&+rE%H#R&4TiIX* z2714u?_v#>Df%on>%R>S-$u2h|1j<&9pxDqHTgy1P7GF|cd}N)x~%O_segSnMP6Uc z-%J)?UrnhV2hsdbfE$lOUG1}YN;Kj`UTV|Ohb-nqUg%^>q^`k7Nvd1_h?bQNx-lp6 zLOoe5{B9mUMaybOJ}2@*y;vNv7*Z3R-!9>{m!YIUCQ1qysF^#_0?x9BXtM-%Iyw(ADXGJa&YXw8!Z#M~7P{f%5z>~!jmn(I z!VbMZOx2ZzpdII4(vOqQa4IRYit^b`XVOoSPNWa$bE4)vMVWl3+YpqmW_h7gFbwq5 zq)VLFFbspA}CgJNkqo9G+Tw$lq=M9#OQ9p_^<*LUZ_MTTl?J1@Y!F|xG0Q* z&KU@PdlvEog&ar`s|>&#OqXl^fPfnD&N?<>!HKAvRuDtvdV!8hjiH%0GMtS)!F46y zyoHhzFf6o!mP09-flo-T<4Dxaa*cL^lHD@jd#&*)!h=8r}9%kof5X!2c#3KT0$~puWoc_wqUJxFJc7Q&ZlS7Bq#Qq z&)7ej!|i#U&q-U(Y*yb8b_E0~Y(= z6?JADS)#bySDfZ6W{G0tI!`gnSA3em>7qCnif9`I_pq<1i()kti|+^9uUgS&>V2=X zNoIk8f6#l+*ZW>)lbi!Rt>^$_`&>jPLKMBu`s1up_5WN%uNTo}w7Nq?$3hg}WDxD_ zi|!E76%Z|z-|Keh94)N>S}Hy*iU}z86~$M4#ivE_O(>R?fqfgs#&uw#I+&O$;qRj* z*tr`Y0}Q)HD?8Sec{EwZNS);iU4Zr&1)(GZSmL*X6&))<)EtL5-6aSnVNw+xD?xmP zAeu_=jn&zEr(6&GF~c9H^W5GETt1o0ch1$RyL>K!z6a(OBk1-h@O>g6t!xQ6{3ht( zbF{KmDC7RD+?~~z#v+UUTG`8By$Tkusy?f}_V}H+>|d_-(!UYW%06%nZ1@{4nhyq= ze*%&Be707xADF@W{unq;4xW9@w(``fkT%2e410mJ8E;2an^j1gy?{1QZB{95*7ydm z%_^nM9tKuz)m;bN_^Kao{U2d{uIQ=`)EBVkWpm+}FUcs_;x2 zISPW!4Z26U8+Vxv%zCt{FRMsLSy^)3`lC1Wp)~$7jJFiyywWM-Luq^*R{J-iI@kN7~fZy`ae>?UL4yVNCHzKeP2f{Ns^6u=R+9 zrtwI-vh~F%;gMe3x(m9QNBYRtGoZ~QGNAQu_{SsCv-J&-;}PlAdN@jWM0&RlL4`-! z`K`Y|36HcXty@5jN7{LoA@@i^q?isOcR=GH*V_N}6MOMQ>t$ za-!zGjmoLe(jW22hf=C_gIKAhq=+W~Hx)BY%=UN?z7@E5+^FfAUMOZ?0xmlQb9cgj zGqsdbD``Xn>1JLRFS^BaBaVRtU30l^3!BcNx38 zdN00KN4)TM84PcTAKq>;@gT$dH^f&UyfO$Q5ShiOvby2TV`ylV-_z(D#z%gSO!tkx zAx3}qjs8oFcDR{M2XPwp3~H4Q+itP39Ns!gefIcv7K@$ppr_hyvDjG)T)r9Nt6^tT zeQ;>J0A`wsoo1McZKGAa2N8x^^^r?xmDe!lS;lx4h_CZAyoQ)1zH%0LzGjK9D}c+d zbA9~-!fxE2FN?lfYgO3gU3`@@$V^{G>&nwGzV?WL>b3Ik%xzgnoAn3Bz7tzX(LK)3ZPAaQ$ z6|PJw>+R~^o>Vr_m0OWib~?&f;dOqQ7se=8TC1#Olkm^L zZIiH#T6V3+2!6ruoE>-KXA_x)-b*Xr-vuZ?uk53lf;xQ~fwNFZ{W*d<{z3)SG+`eui^x zFm&ItCbQ=HB*qYgz*q^LqfDI-lNkDO2u_7QiJ^DFf`p^w1UQdsT6w-}`6Q^pI`0e+ zxEjP|;0>)W*Q$<30WZB(-9hjRuBtZ(e(_cf1i^3ns#8Jm_MvJd2;Q7jjRCzf0z3|-Tl`I*dt~PS$g=4p%chSkn?AB^`pB|rEGas&Z2HKu z=_AXgwIj=>k1U%$vTXXuvg!ZtmQ7!VCo%ms{))gq{?qF|#l*W>D)}18t_uNWvgS2T z){Fuyrf?Wfb^h8zcO5mCo9XiSea=bVBJ4JJ$W!K?pt-B4KZD$Q{RYc>ITK&R=TChx zABG3|hA#09EvBLSX=n_%MgPqZ*SF~lXs8=RA&CldS11+H0vcM+3d+pi0?y~}1uT_$ z!CN>jn7s&Y`u=^q@<6T?-N;6iC4+32CgP(jp0SmWne@>fR+NvK^f4Gv`M8WeW&=u_ z{!N>>KDc^MpTK&w^Xsw9_c4J!?(=<2q>r_}kBRhgh(2omzPUUfZ1f@Ykq5avjcvtV zR`nP{AJKcgdJLhDHh`)gL+Rsmz~buv=A-OK%p~$iySA);C1TlJOkeOwyG*OWatBMh z>llBs;D9?>aJxHM&}aVtda@unm6Fj5O{XQNQZo9Clal|OO3BUGBri^xYTv)PPzmxw z(khu%JwXOgU-inAS$#V3N_+&L$A_0zX@y~}*DuD)PPUEavR>C;0TYu#1RHfqT6PN7 zxLR)ru>#h3f*mPG-T}% z(9^z>I`8W*LaeXNq#V{x{XKw@l8VUsK>rY6s(k`=J`|nlsa*%6J|78~VP8$oE&;Rb zg9N)Jf-CLYXzgPGb0n>h^@)A}*5-yzq1dOw(TotY2U&ac-@&qsP&#>^iM<*l#AFE8 z=YqN!A?|`?eIcm35n?(aYp(>@(+J%}-afI}*9b9(koBeT1{$FU$ooooLygd#MEeER z8lf|Z4hR})g!q1sbx_bKBXkkb*Mi2v3LEi|pz%iNYoc!iO*TTiiM|yy)d-c+`*)I1 zW4aOIPE6MK!kcG=m<+}GLC^vt^f7rq3cB40#mW0gP@NHCx(VxNL5qw~E23YdMoWy) z`PBPWc+0U<&TSZu98u0X5MeFAaU149PZ0K=xNtGMOmMB@Gq;T3bcGvxIH09vGveR$HyI#p9qsXSEuHTtVt=6(D30*` z#K6gv2xD4U8|jHfv|wM*5x$=o=*eQ?&+_;wNRdE3-%kwmVsXZT;M)eXs4!nwaFfAv z7HM5eaH4M(U`f8N;1&V4`;pR)e zuHX*g6iU9X;QInfBwtr>r_mfyseE0*4}?=K`MQE13TP+!x`H1G=qUNRg1f|YXUW$U z+%23M$=4P9SU@*9v4Wq7X_c=l_^ELEO1`e(9svU-Usv!m0YfEUSMYN&T`T#zf?o({ zq~z-g?iDaf@^uCGiD{LuEBK{wCQH7q;8y~sO1`e(ei2jox`GFUGfVPy1rG|iQu1{L zzZNh@@^u9d379MSx`N*bn1|dC73iSvjCp9Qh8woDor%8u?;B5~bQ}hmNDXvT*0aAO ze8n_n1N$dZLGpDP$vOd~eo4T@SzDMjnqWr2e6KHl;=79A(tx=aAbUG+4|YOVTZBWe zYr_S7k|gFsTD%NjBJoF$2S?yWLj0!ZLT54Hl3pI{O87-r4_*VP<)oYjeCsTH@Aef3 z+6DNkw6qU9<5MlQKM@iWz4>S-U`$LH&b;A zRPCyO=tA)DYg z{aE<^gjoAdl2?4f) zOmpE}p&e|;s)h4}&PZc6!Ehr1*=fus7|s`vz|SW{jg8jul0x&3fpBYu><-|ShX)w# z&{S!s76AH(bAdiFucL2fr0RX@Y@DYBx$8ht|4AM!<&^M*^oHAMHzCK?J&Gm8A@Ze z!|=NT)P}_2Z35JW#Nq7%)P}_2_Y95$wIOkMhj7$}#Nqb^s11q3JB^JHE0+z4!ygDo zZAcvcP=MNyIQ)?SwIOkMmzY)?5{GvSM{P(P{#bz8kU0E_m{uDShd&jL+K@QBM}XRp zIQ*FawIOl%b1|(pBo2Qe9JL{Fc&`ApA#r%0m{uDShrbk#+K@Q>l>oINad^LosSSz4 z2ZW3CXJnstJm_JhvvD`q z4Pf}|a1fhYf@{Y9{F60%4tRRqzi>^DUyirBo1zHUbWQ(uBz#MvvKJPE_$PRqL1^)T z4&Lp96z-<5RP0hpoq?h+$xLK}>gk!#^}EO|LfIcacc8}&=+AiE*nQMp0J&O^o2qXo z_g<7$`rJ_-H>CgIagX!4<2`Oz&q8%XcYx2G>Tw;twZ}bMxQuy*$BkeY6*uNfgv&H! zSAtu}>SpK@$o&{)^U2L+b2Y{nOI|gI<{)kWU*%hKj2bQPD7SctUu?6uvs?VMD#n^B zEuU>l3rbsqm=^oA6i#n{r@LnN#OTuNc-!CjrQ<=~$)RD)?;byhShhg`3oej{k~`++ z{Dz`s2(O7(UXX$+8uQWp@s^;zgg72JHT|Am6lbo47bxzP7n~&G2q69lsKcK4y_Zt_ zITUT7xL01V9wp}d=Pz^R(|fq)7eDODe?fV#+?9XYlP~n-@B7e`|BdoqxhucQlW*h6 zFG<5lm3SgcAn%pC@{duT)$QiVFaHPSS>0mFd*xDHbN&iXey}IMVuB}sH08Z=SAIF= zdCFV~c?e>ksGBLz+rphHH7$A=)NU{_uCd`%{8vny zd*d-1;C6f1@Q}br6dl3 zIEKW>Ao_sNiiSg|vlq>bqP~FLyl7^|xm>q5pj2}J@ilX!X)Xi5bR_Pq0EGTk(fl^j$}HaQ zHDmrp;}(-eW(o5*8pz+sOKvIiHv))oNficSU}ezc#jccFG6N{iTjaD4n!JcBPJ7{$ zUx}+^phHk@W=rx=kHG7e$;*L~dfig`=Tg75We)T?t%alX+geILlTu$BCQoFg|Fzt` zXeD2ev)V8h_?*?kQTorwO@&sX(f^~m`G_y|sIL4krhW(AE;(wI_Crp+woAJ?E~OkxB=IJ$$Y{;n z9G7I6evZo$FUKWEcd47>k|J8k514*nj!T{tinGI3952TuN3Y_%t~kxy9GBvw2!|IRvJmUPR6WX>J)1lo_)2FvQU+dbbcF3eD z=hmJ-Y0T6M&zLg0w$J3z6OZpXuy)`XQ_dbewYJ;n36pBO^zYTRSBDV;2KH*(=EM#o zdQUrR{OCy|PK1q9PZ}|B%Cyk~rcN6*Zc^>>lO|E)%xPz9C-ojw*kwRro0e@lv^=_6 z(`TI$MLb#$iRv{(=xoJUn!ujI3_Aa2Ak-tTo}-bD`6~MRVy;_W1&83DM|w7 zC`{NCeT%0yeFk&>;%8R8mMa=xcpArPO)sUurQ1d0X9yJE2vWa1V8WASb3rMl8PD0YFAS}27nOaPq?t+F}U!fB79rAtxV zYz#%u5z(J9ldVK=@nJL3O%Bybe*w|*reN!MfJH-I zf$B7C!)7@}G+X-dWZ*$oX`UjQMfU?s3QHwaU z%Gx_ewL5V6SeVN}oK-VjVhgOcz{}^->n-Gk@bZ6x*OZlMIfza99Y;?c%Hk47U(D0B zl9v3A4cTEipuE=oJ>>=gR?GW#KN4zH_d~G-jCF!q3&}YEcSh>vTI)w#j$ewG(Y2PJ z(&c9At^&VWT(Xap%guCo0emQzTPU{}P`P|pxm*Lqj!=2}PcB)#HZ4?^)2g>zp%0RU z^w!BTt>1@CR~Sl)5d4726Tr2jwON;ofrmpsrOm=TEa<_ZpWMcKwJ*}Q4HGQz$mrLm z8#D2nKD>1YvT$#niEFRBaBn-9{=z*<`V036 z{Dpf2{=z*1f8id1zi@96Ec*-h$nh8M5%>%D2>gY61pdN30)OEifxmE%z+brcEd2Nj z_gDpg;U0m%aBnNb{Dpf50sMt~-vRgw_o(A9+#~Q8?h*J4_ZWe{aF4)WxMx~P3-`#; z{Dpg2VAU_&qrDn`;T}=_!abt;g?kLJe&HT%)-T*6uYTbkdG!nTi0T*a5sma0?h(~5 z+#{-AxJOjKaF3{d;T}=_!o6bDsD9xddG!nTi0T*a5!El;BdTAxN3_UaxW^jRFWe)K z3-=aN1{~)D5Lmd!aT{hcJ?Rx<;oefv0Tu}7ZI6S6doPj00^x8UH!*~TdppQsL6|29 zdrvqnW|s-Z!aed?VZm6qN8HxK^$YhtMX~Uh*I#7o7w)YA&t14j?eH>uT;Pde;oca~ z?!rA53;$M+kA-_zldl%;u~^(Z!DU zCkXy6z_RD(0Q@1qw(~Oqu)Y>jj?MS&gSvnWy9(FipdkRKJatR~3HuCOd4raKeEUR# zfPg}~8}2@WK>;OpDov*dD7Rn6cUsUEP-U;k2S~M!L*Ui+Ao>Xjrz2J#cGH4k0XYAu z<5;Y3ja^QVCY+x39)fg>P2AU>*9ZWcng9&6Ti~`Vm?4~@_H0%=Dx6yT7<~T(GcC5} z$k2AyCrdb*9y);*vaL$A8@4VA(-LWS90b^&X{A(;S#0bK+2|qVi9sljwl^RhJssmq z_tu#xzFmGf`Da5xi?&DsKl(L({5PWMC^0pYmh2X_ka6YPE~Pv(YHLyE)YdigK2*Ry zYA(t%v#iJPFWbtpZi7IqUFzUbuo=&RVCqmdgcdJFHBxIyTX7~XPaR3xj_09QQqLmo z#Al<6Q%94|h!>&}QqLxx9Ulg_sppVR#9v42rj93_AJ1m_MAC)vN%S?DbV>XzbbIO) z(&h0|+Mi0gD&C6rFCbm5nLnayQ!ji8amVsgFXFG9Iot(1^%7P=i@)3l?3twXI5(b7 zy_~cW-+&)EQm-U!##1mY9acmHFGt7lLW4xAJr|$o@vUgTP?z42G2e#a z(4cCBX}$!DA?Zx>5ef`pJ0&bDG_p5-yNzEPK-pO&wK#w74UM`Md@J6C5scyxY zfLv?lodWOvr~9;A0d#%ZU@w zOzr_5x_Ti>RRe|FE&w+wd!s~UZrQQx!&4?xx3A1>`7s>uFuX^*~)a@ij) zBKyPT%l>eYRx4?R`xr%9lhkssKU_rZ4;SbDaEi9$+#gQSPW)_)Y(;0}V1KwsTW*J% zjV3-F|HA|Du^xwnil}9OxJZW@{Gc9Z{-%i9A1?k0LXW8Z;o{sME^-X3VaL0m1tOhE zJ8|w07g77e#koIRMC}h3pG|qSKU|#q!$oQ+pC9M`aFH&g3$?~-f4IoWv*?-o!$nRZ zsl~ZJT%;%IS-IRFF4CJZYkDsChl}(h;6;`rXC8#4A_ZE00>R9U40@C1q{Rl4)Z*M9 zE;58pt@sHHZ0Hu0+wpf;kzt>Lo`bfbrSM9aWPxik%VMkK%f@h#Y3X=ujdNqT$OR;| zI5&oiTquTNK!$*93>Ud$Cipqn7%pF)W&deZVVSu z8^h&rW4Oq|eXyPp=f-f6MU+p(xiMU1@uPVB&BvDwTr`o5;UZIYmf74GF5+$sXLDn? z$ff!|T*NK=5poo;?ImnP1st0j!$sVU;cRXU7r9(Fpp$KLW4MUBF`PY{I_}1BHaCWg zT&*7iqlKy57%nnL?*dR_b7Q#3b$Wk*a+@2&Mcj?yY;Ft}aW{suxiMU1p7?2Jb7Q#3 zP5My$>u7UhxX8`==>VN=ZVVS$AYwH(H-?McrcVN=o6U{kA`A6L5NLOs8^c8wNlgdZ z+!!u$uYL){hT7a1F0xn*)S`o~K#K*X^<-nX$dh|;F_d0VpY6X=t2xG`L0 zJ9WFqxiMTsZ44LZ#&D6HZ=~WrC(e!GBA;}}$uu<1jo~7Dc*UxXb7Q#3XS6>`E8stl zheFn;P%0vjaq$i{Gy(b7Q!OyD^;2jo~80g=5>?7%p z;!R{@xX77$8G6y?#&D6*GU(M-43RN9JJzzfFTRoprg%=;UW_S)Y#k@E;30#cP-3eaTKgbrBk#b zZVZ=Yu_Vi4V>IQ}Lb?_OCrRPT zy7)G9nil7NY0>*g>+xg3j4oLL+K6+%wCGaOR-F5#Meir=?w1x_wiQw3%YJFmhd!iD z-hV|O<}I-nce;UogtQgs{ZsU@cA)Jzcgcya?14`welO|ANoT~lUs`k(<+J15FD?2c z=|m3qON%~5nfy5SON*{%d10LUrQu-!bV>X*1QLCg6)lf*zqIIcq^siGFD?2!>FPN5 zON+ihx}8?Qs(yor3*|!^APT`YmZE&i&G&-z|VV zT<(_^{h98j8oAsrE&2<=G$WV$rA2=wxWLHeereI)2re{oxnElJFu`;qmotRX-)U`z zk<0zkqJOZfXBi>xmloCZhY-RXBgFmEqPo5k|K=K@e=|Bmm-`JP#QoBurXb8+@Fq5D z3BrD9Sr&U)8m}c7s_{sHLq}Ow9)R%KU&2RWCl>OF<8&7C1BDz&Symqa*)J`+h8ygt zyWr?LHepouON+{WY0;$p(xMxuf$K`X`64AJ41uwz?3Wfz+Al4-X(70={ODHh&l2Z; zY0+(+Kx%RBmloYl+KO|(wCH=J?Kt;Ki|!!p#JOKu^nKD9aqgEE-AOt-&i&G&ACOL{ zYLP5t$X?y(PJV)k?tYySWJf=phoU%tf{A{{{?X#xFD?2xX)DewhS4ub+wtzC_mXzx zxh=Ynw7Xwg^h@3-glUXjDHok|G-C}wmURwP)3{$+G@x@VNB9#=<`5PapAXl1)hK-V z1k8>h{0{N}3)&lOzs0@0-N5n?ROvm6!-w-%m*W?PD~LOYWc&fd((DBmRPwRjO(xKv zY7aJ-QbyYgV&!D_E5I)U-quAWd?j2jGAMB?Tsru#*WF58nZz$LNKb@rsbnH3GB~Vn z1g=;F@mknIC0C=WC7h?$BNEcdy}k9i?a^P#Qba60=39!0rA@^0GepGTX#AG=AzUG0 zNk-#?sH{{zYOwO{h^6wG;%NYIrVC`V2RC2d|A%P77R*v_H;|qwz@t0!h z7T}6@FgFX1D?0klm=aLmA|}S7=USqUdfnB&vn}Fm6`e^(E6Ia29yl7J@9LB-S62uQ z*%GE3)L#*wd4BZ2_y%7QgR`KZ489_+?*&%TzbetMA(rUZilvW%D@tH)E~78^qi2Rh z{ZSDK`Oe1Rf}xt~QE{d{>^XZ>oD~5pXDh|o@xiS6&5P=7@Z+YuzM=-XC?h25!nN0826~zd%m-a zRLy*67pa;NzjmBx^3+&E-0oPx=q~M3U=_?I5{&hz7t9RtR194CJ={HyU^oSbbCfR~ zRs4)H)d<|mN*^uKTm438kM9Q62%{yg<7ro}1!s$&vwS~eMRPWA#Ya%zz)FAO8|UU& z`als`>l?qxH$G5|-|HJ6th&!PK14J>rt!C+zLmx|`^H-gf$^>)vdTBksVx{(iQ zE!YmU#noZF?*X%Bs1!3{ReB9#{^KKri|Z{$*B)4CA(xOpcm-L)X!nAf1NHZnbtImt zIE136DAKCVI0kA5H~I!j8+!&0(!d%T*y<))BU%A2U%mCDaUxT`2P z?gZr*7Xjld2cEb2$}duR6s4Dg+Z)mqkAWB_YWsOE-8UY%ov5WX@oIb@)n-#|I=G{# zb~}hkqV`m0sLk%^t4;RRW>f7EsI`=>K(FF`&;h{8o)Big4TorQ-x>CNt>RQLFQ$t# zL0ly+j$vd|E2yQhLihMCrqV^?aY(lVcb-TuI2tlzvVqlwWv4GahSEnvTD9F6w%w^z zE{E`4qP(8nKIAZdQ->&AB`|E&xEVs_OMK-aRIa0PCY0|NAoMz8KTU49Hrcy z$}d2={8w;SLK;Ig$YlC!Q?O3p{^rPMgd@DAdOiZ+5gMXbpNe|(2o2J!BPin$8mw2Z zLI?8*VMEl*(fm9@!ytbgeXkV6?lYB)vI?vmPcqH#yITp2w@}8b|~W!I$E!G zV1q}fquy#6{__ZZ+v<3XVjiJyT1C1b0vuWGT0MY&JhIxh^4=85?$nAmK0IPAT5&sG z9`OmSxVJ8k`1n?xhhQ29M|@l>ZllX1eom`3ML3;s#Hw0x%UT}sF|7_jjz@fStB=9t z5vy#q3``#JQLWbEACLH1t++!jkNDVD+~Ac*{ESvx;h#r*WGik7$|F8P85{3?t=KicUs9 z8ofA?-Z0e=ua;hNg@zdsR5}Il2I79%ea$*x$>h9QKRIvJPtIF1IUnTYd_Yakr&!kg z`{BUm%J1y!r>gfrRL}z&e2;Bz6oJ> zj{eBIAV;<##08gA^+7dN?{KOSLU$56%-mN8SZF@-E1ccR}#|cH~_U+yNbV7v%rcyC4yZNhO=eiXms+ zJDBY$kcr;{nfNV8n)r1#GH)VR)MEnETT$N=q~@-uC+)4MC+)4MC+)4MC+)4MC+)4M zC+)7N7m|S_9>NF40^PYQ>UW|0mCN zhLV6e*Auwk6EL-+LloF^s|YOe1U3LR<^9|rx>oclB@S_cL%_uT9m>Z(&qS_P^bZRB zutNlvz(jGu2o&6_PsKdUQ81#{^}=^`$vgOVMJaQ@?#Ba)nr*ySR%7e^%4Dtfy|T(% z@83-JX}eEQ=n0r8ejhi_`nCEBm~1B|*TH0YA9}uCOtynq^WpVaA6R~FJ(>V+#YQOq ziYU3Lpc3-}(~L^2f$pePZF3owvLahpnPkCJ3ypOdD^U*ZmIG#XKh1`5)rzn$*-)#dxMF`5f%ltOg+b!Io$q~( z?|qPXkFD~&4-)TvfGdu7%`Wx4JAdoFce3{eBJjSKjowwf??w}4OT+VJ4^{WB;(ej- zy{mYC8Mx(_5ND@rEgoSFjuIOQ_`07ByKw% zx1WD&A+9OO9$ED^V9u&H7bw%n47QhlDZ1VxO9!@#fLo!zQ`;#MfgV}M<#vXjkXsP; z3c^`>ILvUU=cFN11VN9ij?hj6lu#8+cOi_C8*#$}#P!oP6QG%>YsMAK1TO%q!pllB z!dv+yQNWmmXnJIM@x;p!Kt6osWa(yleVmC1+Lmr}>#M_sWqI|`z|(M}mb%;6fo8cq zvi#;|jQIh-WeoIIV?fp%Arm&KZ#M{P1@(~J!XyYcMc2;OF#uY_YSZgxV?}FX{_!X- z_Pr-}HGP-3zEK65D|LOlu&llk^xe#}PR()v{7g$%&FjTzq@pESi0$^5npQ&4?Nka@ zaRheGotQ4-aL}Sb0UG;n$70fGP9B!YV^Iylpc;}X$(?Q|bvhiRCUrVsD2a=B!rmx$ zyiuH%JkrwZ8($6SNPR=7f{d8f3`0HY4U)`;gDT4#RN4QrgJKOkDBiGxavC;hqP|a( zh9jH$&%;p(-ps*~|G(Af$t~?&ME>gq;LmM?FK6!zR&A5&HEzgj+;GFzalF<^OTI98 zr#^vc5}!zG`_ji8@&R_A;AIN$y2aKrF$>ieUjA%{K-eBNJAv%-dBrl{eVX`0kF zsAIA3KKa^!E5o0MMQMWqH1gk`oc|l+;!c~6oy$xIWH6w)Lx<}pczCYdlZX;VbtPkG7WiZ5gp5rtJmRCLir z7PX42_*_(UcU>Q>qN3|#b=h6t{(ryw_#TtA1ZYLsPJ45|d%ycU_uO;OIrrTA75O`{ z(1qV35A+us=r8eB;-j`pecd<`jhRO`{Og^I9tykXgYFuw4S>@7XA2e3`p}fYA8*9%1eP{Zf#e3xhJ7s|tkqgB-zUj30 zoMPUb>WmQdcfF1ji?%S4C>it>y$g{;4aimExj}^<0Oa#q*gi};u!H0&B?5V;9k5}QTK`u& zWy!g|#=~Wx`D=C2daj?c#wOz=7nTK*nLc$DdO?=?G``{st|l5!)wr%#9M2itGKSLSMr3Tol`CYGi9do&wP9GN*vqt7X_v0waEUQ|`^_tGdDi z8MLv|M+q>j+k6qvgESnm1%>{WpX9;K^l9?VHB}3u+5&;ZZDHOjyiOy5ZsVy(L>@{kda-0@PS^R!X(1@ZL^GQm zr1Od|e!Qjl;uY_o2kr6mMtWq>o#)PJ>$Q_(&t+f3p27KX+U(gJuz;L7N4y+i4{R}p zUe3tHnYA9A!Fakw<&UVBjb`bm8n)c9-jeVrmX*V(yX)h)U$kT6pSedF5-$`nBnF0S zyzzuCbS{xqQuQYvU@73$v-k(rGXT#Y{Ql)e$mIrV=>oIv7)}^^m_qOBb&|V27OA8$BF|>p$K{B99r>gucV5?`Pr#PhBupWs#;*ileoa43R0KC_iu6W}XPZV7JI(){>ZLm#X2vB8`Pg#0ix1xY8eod6yqb-hR9+bz1995m z#}epi6_yk;UTf1NZ7%UfK!e4Ez^cVixIxk;DiOCg8(#gaGZ4dWKpO{WZgFOdpCuzj zI@_~ep@?%lEdmO;f;MtGaACglJo(V+tr`oR^ zfT$MC3KwKjs5b9!uul!5=xuHem43T-PV8`bW0nW2UpIomIi+8Z#Nu5=kG!Ac*7)2x zP!EC|#S;kF{5epA<=oM9Hcicrrp9tJSrDu}l|*fg3k_#*DNs0r;KXvsq3m^#7n#?2 z#u!NE$`P~C{uxNJJC%;I_hFV%%o@+C8+1@Re}Xz&pKN-GlWg`3z+{r$(x|)9#bi))~bbHFe!VtLh?0E5|0m_71lKS3|XhC1t@M|Ab@W1ii#yuCDM z6!QoBG(Rq4cioT)9|m)mO)uhS7d?7EUhVe%iv;KI*vtTeKU)GLAE zH;`ZBMK5Z=H8@EDagnQJ05lm}hop{z{Zvm(})7#)O>kBf5a{3z!xeEB?*S@sBd zAeC2vhTwW>^XJ-KdekUM!^LIk>$FEHo< z)np1BFV{CV*3a&EI3&^@Z32ePx+5w%X7f4ZWwj~R^B@Yx9(RtiD0!vEBkp5+XT1?E zF<-dQpz9eXF-BuRmSKKy;1wNdPS1!kx8oLC+aKo06h1F;@IPa zZZOC2IZ00*ItjoXRfh87glAS0j``fJpDFcjtXa;As#b74%dq@c>+`Qf!yF9I6_256T$1+>bQ*D3vECy?9oheCnZ>S4llw zETYA)Ys2~MsfTA>fDJZ>(z^m-C=K->0YdOJ4y9LN1YSc^56>WD?jIFf`~=EtS%oSj zws_{!N}G$!iPZX`aNvE#3&Jo&ri@lfxJh12T$eo$D^i z&_;R5(pDE44YG#vncf!^A^#F&tfP=Q>@J!$K;oVYdj^kW*h(bu?Uxwr09|rRpb(UA z!;b1SeP{Vbww8;Pk*pD*K{_!`%lBUMBarmXoXrM$d8-o|FOYMO{nC|d^RS7MsMJnxVxjH)SJf49lcW#^JcY< zN-SMQ!#5yaRtwPb+Fc`fif2g!0!TAd&GN{eyF1|q-H3;$dx(+O^4hGaUalJh=E_^M z=`uHiG|Ck_2$GLFu5KV-M4UtUXix(cZ}JmE&!VciF&B*$QQYEAP3|7)c}kL*M?s%E zmMJ0H>@Uk%c#_w|(%>4fV@^XF?*eLcOh_wPH^(eeE(O#vX<+azE-FK8 z9)nmwftAX{a+P8-UqDMszZPPH(Lw}ua{)PO&U{Fd$4`P|_Yzty$$`vy&^MpXdC?qH z&J}G<*;>xbH@sB&I62NSMdWS&m;y9I;@tqkM9e2@y6L2VK;$w_Ll{J2nphe%M=;`B zou3BKmu)BUShu0DqO(14^iVwTD1>T+fV|O%J@|gLSa-IbqgD^h>QkP;-budc-r9s0%<*{VL?jY#e#d$%) zA$W$vT0SlrR8KRpr+I1bk@#e{wWO$L8U-cfI7t48!B*+4(PEQ|J={9lt~8Q(@SR7_ z<1;)bOcamnSwpab7^VX;0naOO&gvqJK0pV_oH+c=R?mtNa_3FnEGY9c9ARBPx=kJ;VhXgZ z@)zAI<6l_Z-CQl_83G_J2|y3M^5yfeBk+o}r@JHEfy#ymZlH7oezS zi7~wOZ1ni>$Fti*yz`p&Q}f2ftESMKSnS z!>@vGek$Ls7)h1yVZ6tEI{5gSRa6JRpuj2$!sm~d8kyg;ZA7|8JdMHM z4F9j;?}q^?a*|cl10Nq4 zl<{}MXZy^LX#&<6xSdk9;~vj@rn_HHI;3Zr zMX9k4z= zVEX?nw3q$<4f~6C{4u<1E#QD~?i5WQ5jV(}_?iBZuJYHTJgWr$V@UsF9q!ORFC%i^vs6jt;6*0h6`8=vIcIePgDIlAO6dk z06*eAe+EA6&uw^b$_?@*ex{$@D(K*efn!j|n{-DC8@L#}Vz%4i0@mMMYufoK)E`FN z)9~4@^`|Sp5kAWwgHO7}-xbQ61@9t^(>IZhSPF4(QE%f?U%zpAN3LLH^aY0 z#}8|t9&tWkz3Ppoee2J(ioSyQpTQ@*{}X-*(yR=s@M`$yAif5E9sDcdm%!)GjE~p9 z6YqbAcefWS{^CgK<{OX7ioQ``S>N5P#AAMa}0s;DcGR z?uSo!6r8QnT@Rn>_~X3gkMx*7;}@!+{M(4X0qcSH8hAa8{JRiWb&jInjquqH{(^Ah z2z%kdc>b=116{)Pi|CC0bpy`)@$2>c-KIQez8HLXT*nV1{S?Y49`YBIe_j6zI&AR5 zv}2==r*|G)!1~Q$(~c`p-W4eKSLXu%b$iTu!1Pbb^xM8@(r?-7;{Ew}cR#|!*GIMg zg!X?0zY+0OAw?g?;0F=D5&j!c&-$=cbi1z4)H{Rs{ME_7Sj)9fc=OkH(2T=Bt+pVHA z5iZ!_&gX z`0VGKwf{l*MF>9xpZNGW?SBJ4=hsi*oAr$8R#vO@>)~^Jy5YYZK7V!cul#z4d@^t( zT=+A1XXYV36)b-yOghCM;lp2#et)G3TDb9E{@70QV;=+7jzzX--tE%)f;ti5&tFjf zRdeJ4wA+mDJvx3^``2op-UDy}Ytvd&{$b<`A?|1J+0K`O+O4C72y3jh-bSS zb-GUY9H0B(zX5(-tyT0d@YmHTes2su>C+^9!vAXcZ0F7J*TcUDKFhsN`}b@A0r&>K zc&+Kt;JK#VpTqmri2t_se+hpJ!l%`%_z?U$z-_WY$(awszaQ_%qYBUOfzR=N0zUDf zuu-j(lki`T@R#7P20{96vr303`HSIi!0L~hcAU0T!J`ts8AsxMqYih&XFo30J_{k< znIB<}^{va4cQw*==$ChzMDVNN0@fFMO}fXB?n%TwuuH-7Fnrek7<}@L>swvAhiENN z?M#{ccjGt>HHM_ealJrE4=4;6|^aT1$@GNBYfgVNXJ*fe>uXp!)JdVfFFkc zBz$jwe}cGxb>1sXJIu#>%ol*nXN1ndM}AnZ`OcB~Op^J^lKE7V`QFp#kY3`0_Me8I zLw@toyIbR`JVZ(On-48MfOx{qd?M^|9exr%`(ZxL#(Ye-XtzplzI}I&4!>0Ut=eaL z{uDfa^cK@!bJelAD>;Ys+mX)P=xr{Tej4$_4Rcwvx%S#zzRj}v!{8NB*F#60j*3NF z@qD9p)a}qww?juAj!DO7>T>7`po^i~2uG4bXMT*M?uL%K8#?N4=%~A)qwa>zf^LS6 zIvZ0CpQ*c{JFFdbH+0n9(A}vWbu^}4K2t|y%HcD0HFSrydlWt$bv1N9fHV1@!t>J% z<6i;)>fd@ip9yy!T%9ML>6ai($9OvGa_H{UjyfAt4xg#Jp`-4Gj=CE<>Tc)`Yxha` zCLi@R)YZ^YS3^f#4IOngbkx<*QCCApT@Bq~?Vf;7M_mmabv1O<)zDEVW9s8GbucE( zXX;|;sEeVaE{2Y}7`iQRCOx02d!eI_#l-XZYVD|Np`)&aj=B~)>RRZiYoVh~#pLHR zbt`n#p_q6+QQd;a zOQEAKg^s!uI_gsBs7s-{9FF=F>Qd;aOQEAKg^oHC(|$fvcS1+q2_1DObkv>DQFlT| z9f`@uXX;Ams4JnP4#d1S^T7CgN8Jb=bt826w3IVnOu8fa)Q?c-aHRJyRJ`dg+eTdo zT{CnbraimxOkD^absQ%CnS7?D?jt`PPqOSE1{#Vgzio_Q%=6mchr^8QP+|G{@I3E26ZKL)RoXtS3*Z!2_1DMbkvp5QCC7o zT?rj^C3Mu4&{5~{Ozkl6VOr`&=%^c^qfW%+=kuf|Z1S1+&(^0tggT68o6pqCywrWr zQMX~rG4B~i9fyhMGj$zw)OFBN*Fi^J2OV`CbkudwQP)97U4kj+h4M|m9zt6_1=mpy z{TQ5ye<_}0aJR!f;EB&~uSsv>**EGuOgP^+>6wN)5jyHb=%^E+qfUg5IuSbRMChm! zp`%WOE(Axt2z4TKfgQkCIO;-7y?mxF#Dw`wod_LuB6QS=&`~EsN1X^Abs}`siO^9e zLic9vs1u=kNIU98=)R#Hbs}`sg_!#Jd>S0}BGie{QO983|EYX44)d*#ZKO`)Na;;^ zOhcUq9d#ab)OpZR$C00(anyOxQRhKNod+Ft9(2@s&{5|>H>n+U9(2@s&{5|>N1X>9 zbslsNX!kkzrk#AIj)U%(+EK?rM;!+pbsTimanMo6K}Q`29d#UZg^kKl$3aIO2OV`B zbkt>-dihM91|4-71|EE-PJ`}J?WnUb?@fNjQAd#<&p7HV=%}-xqt1ekItx1LCQLbh z#E;L6qppJPe?0H0pP+7nj=Bjt>L%!@o1l9s9Q6~_P0)Q1j{1owwWAKg)W>J)BIu}# zprbB=ZaWi=(0yCGU&5z8g1QL0TeW)!d;=doQx`!;T?8F< z5p>i=&`}pbw`jMUkI&Ra(4C{*OX1VCYS#K^E*d!V})j`|1c9_Xlhprh`A zj=Bdr>K^E>fHUPy;2~gPyBuHa{VfhP+4vy{oU*8#z#&;yTy5kk) z%{%&cMx*#>^3-%AFLt7ZIUW+Y=XJ4T; z^wRzV>CC?VYDP#}5&*S_(wSre$cGRN3NdoIUprJ7E?QIDR~)V=4iu>=P1U4$yKR?Mi-kR6$sN^Y#l`qvT)cO0y;xJV zskpeh7;ziR;?*ocG=u_6R8A@~#qVufEDlwRMWN!-F|jfzE(^s{<)(1zIK_tpcKzkz zK#$ChOZQRAhK(W{5@!ZCpA%Ss!rnp}VpW}>B<1s_RwpRQbD@&YpOQ>XA6H7ENP?Q> z&eWdVKVc@je((|iw8)wC+(QsAwKwDI<8r;`UV`|%Wp5PATg8gjNI1N&J{%}iFS)@W zZnf<#rLptQO$2NeOLjthz_z!QhR-`g#a;;d7qBKyOwSY3^Y}6t&wF}~j1OeT{sa>= zAuCEG$p*|?&*xs|^X9al1yJplWq}EI=QH>E#5Wh%6<9Q#B|H-561ty%l5#Pvs1Z{^ zu_kC{J$DAhXN6r--%!>jrbCsR&E)1@q4;;K;-^$an6)ri7;X!PFUNC0WLw3hA+aGO zmITYi{wl-sb6-*XK-d+XVqq0(3T+olgNd`v63^{M@sp7Mm7$>AG8KOe z*lWwG=!xEy$HYtHczv7RS&qU3o(mfi6eBg@WD zLt$B&Y9;_K6*gFANn%O-pDGB5t$ovuZ`8M_drPG*&Yq*4%MW zq+0vLsa)4$H8o;IFhI4~UJ@1SDZuDYMs!c;txo8zJbEiVIrCTHS+s%l;yJ3M98v)4 zz$Km5QQ}bxe213)XeK4f?UG1MIBe!8O{T=-NYoctsAepUr^J&GAR~rm1UPW zi}zv1++^EwdA||$1+2GFVtm$G=y~e%UW^OrF(44o0{4#&4b4_?Z-)XrV$|HnQ@wp$ z)y~IP@>J^cKO@!lab#f=d%7ADs;h}uYA`d9Ian5jvRkUuk9ocGoYa;zogJJdm&`>G z$J0amAR&`)GJF-DK_->l4a$>ACXEu`M?R4TlLUFeSb5ki@=vqbEU3}_+I=@d>+My2 z3!QX`mTVtu@WoR1KQ%NwN3@DU&xiHqz#<6;hO*T4FV?}q>2dZML5FjLNw&<#j^GtC zD((*PN^z(X;1wPQ2Zr_yr_;Y#Ycs$N(~kEz7dR9Z69_8#Bwl>dhMZUt++h^ z0o~-Ik*)ZSC*Q$q=g3DBTye8EAB}OvAB8PdBH##n_nJCro=YyWBs_}!9-(IZhNThlR|NT&{67`ge)~wSR2+U z3Z3521Xz5L^{+bmbF47gLar*6q*T(`=Dr87>ZSdOHpW` zl7GbIvMTf`GOBCZH)d29v?&%}3)tJLFJ@Y^xfAKtDN}*vSif(@NC&Jd`1hID;(5-~ z{KeNGWIivWa8TZLcwCN2_fPeMxW3MA3j-d<|01+F*4=M&2&F zFE{MxF)-F3HhC3kbf7v{7o7h3JEV3GbkDZ1En6@t!r^V(jPyiHa`J{HChlUS4p?tH zzQaS%=Z}mt95X}Q*5tUz%~3okF^fUp!hItk|KNZKUDbK-~HF9SDIOyh#rGvC=Jx>#eI|WQg^jg4U1>%!Xh*mqx15X)< zdq68{BWk`NA5R;IPZrpxAg;K$)a2&j11hvPnT3R>5X3Kay3$%RbUc(GUcbOzT^lhJ zp63(9^^0w&yG>>uRS+LqXp7~++DIvuw^EashZn?GgpCo8)QY9hk%ubksuQKCLHC14 z8^pVysu!grlaaXS?5Q@z@}z_K5nfG-GpaiAt^@Cc60mssL3}S@SC^LVrW$%tYpGGZ z^FW07b)j8Sduf@|5T1?@|Bfau3B9v6C8k@QT6kVU+^~pmCTnZa%5-ZrHU%aJoD@7s zAr3P|aIzK)z0(LDtq|YC3--=*i03TC7XvP6dEi3)4TxWLaamchkq3GFLfmWHtLlo+ zFmXJJAs!-`EKg0$i1Q{|3MrP6A}F%k#Ra4y-zCvJE| z3GDwh<}<>E+VGqc*^P}R zf(M?&55UbBn!}S%;t!Tm*nqb31eBw|L6|3@xGqYCPDakVV*btNRZh&i6DEW6GD|#~ zUS)nf2)|z;XThJ_vs-TU5UUa3#*Ly z$&-cR+ZJc^2McYvW-g}!)%y8ds~rIWRo`68Q-4=R8bzM4kv(A}YiwjaD;ZZ5$+yp1 zy11M<8x0`!o~4Vrwb|M+E@;XoTW>&er%;)k{!{?fKhVt;USJ5*0*GlM5`xz2(At*tFL zY__cK9RWxr+OAbbycZE=W(AcoFk^M5wT$>U6j8B=n1R)7&{Qv9eASbZr+UfXm(@v? zSZ$xL%-=Jm=8j6=_*8z1FH$7) zR{Zt+2x#a0DW1xY_(guiZ}KCqE66M3mi&mf=11IHpds>v+*w*S7bEgaB=Pt#Dt?pu zW3YqsqCT2%G#=pijL%#vq}<~$q)SsO=XAi(L^hR8U=Izv_OoR0k^I?GNmMdVqM1-i zuzbRa0yM?s(R_i)W(=%&L|?oPc4_B}icn);ZEs(^1_pWJw5qs#u4vfZ&~N^I0;+Lsq2eGL_(?D4E_ACB70R>ENP9Gh-|RWm-BTC z?c#7)oY9K6Sxh>Ol)(GkVtY-6IM@ok z3V6-mzk<@^Z$-#aiSeoh@sq`Nak==k?8ZY^g(6~2&!O<;hek*HMyIDo_fAizN_kSG zB^0adi$U2WPP?YxG(pz#=_R@eYl0#d+}!O0;BS|(n@b3zTrlp-cl%P$EC0xReT9R3 zvWg$(g@2V7e$~nT^l#1!zb7yJa9$WjP(ILqJ1_k6yztd4{poMX3%@-t{0~cQyM_mC z$|AM3VX?HTzE)(b#Arx_t3*dg?C7bDA+}bm4e5t_uc{KIRWz}MHLO^T@l{X1xv~`o zm!X>4NPUf*Zp(Un&xm7ujWngg9#|bWm$(@=`=M5>c(hD>^~zu)wmrnUR_QHSABw|3*w0+V$8b zAObX>5*6^ZO;FxBm3)5=Yy9z9r=HpN-~?}RB=fO(uklL8kkXGwxWTfWx9Iz&8Zeu) zWTkwA%{kV6WOMX~Sf#x|b>hz>@i+;!!cQ;hyyZo_M%q?>Y^hxqf7u3SD})!nh`*Ju z9$Xp}AGcfg#z$L3OE3&_{;A7aLE3+|EQHkt!NZr0m@N!RIR8Ord*4z!?2~prFQY$+ zXjlMz=fEAzOz zw-&UPiOZ?=cw!>xEAg5DOZ?vg8k_$0D?*OJnQZ0XKrD*m^76>m#?r>zOF`` ziW7&KP<8Rv@CNTcanRYyk%|8Wl?23fOIXPtvi>gpmwfl?rNOX>RF&_I9YUIqW(d5$ z#`aFRA8gkM7W9E70NXOPqan+GgN(iz(f1?w(^-G*cgweT?lN|&R|2NOHQd=__xm60crhZ`#`yFUH*dx=m*I{Z~3fg4bAy z_b#wc+1o~&_6Kc;e(_=}@j2(sTiiFi>PkGtH)YK8d&|kg%df=m@v)xXKK&0efNz%n z2tWFzh_uuJ;dq@E66kOeGi$iX;7#DxM?@s*G3jX{RETO0je_3hI03>Y;e$p7?)~GGfC0z#j2U z`Om`qrp!!FIn!QS$QZBM{f3k5Q!e$X$Uk$Ey{7+?jbbKvjxYXuC*_y+o0IIdm32ty ztK*(Rds{5h?`z2yWZZ6FdH=z<&!4 z){@3F^G}_mHu1(LaapT4HP|86wsv%YX4i^n2uJb7lA>V8C8Dm!*D&yzW#u5VwQ&>8 zTLs0P3+z)jmRFYVt!^6yU_W5DVy$}Q$|^Ba~vRrHqzRW07dBLc7b->X`@}g1kTZpaYonk{(ZEaCWwI~mYcSEDNE`)hZ22+s1 z6w~}8j{(SImb7aZ#m*nGUt6RzrVxaYzRV(1%Y5!1?2F<(PiaC&TvSgA0(Iwj_bs5u2GbcfRE|O*Z`}dEwvYg>PEybVa6rb6)s8dEtM^ z3u7C>fP$CCiuauaP@Hw$#i>3qkrSV>g5pzFPOKjpo9rL!?XBJ?mQ{&xPOQ$2^_GOW z_pz|5A6q}p|NY@k@$Ogl?A)|v?2iZ?B>H%8yqS6y5ZDXq9z3K6^KRVWb&2xxLo0Zpu=vhWJMxk((L?dFl8Z&!m&c_K*zELA?nBEI zG+S7#gkensNWg*MpebBUgk^TI(_?z;kagiT-dF?hed=JivifXHIB^00WblW}U&D+c z5xnSI{KB$VMa(4RmEX{s*~KN*)opP@W93A|r828ZJdwN&oJaNyeUgbjsKbv-wN2#2 z%seqOkFDBo=KwcX=@VtFhjlo;%af^RQfc;|JuIZUh!XG z=U#VJsINBCyT5`lv;NdZpg)e+?l*@dWqxeEow5UrU;8Lbin!_)Qg{%d!q?Z<_R3?b z&>X1asy&6`oYo8WijzlR@}u89colix0;voyBu~HKjzXNEHLsV4s2aBmdkVoshpy>} zFe6yTH%h-4t?lityrA!Gr8wn_gaKIuDt{d+-!I++d!>i$P+yIzj200Eg?HeuJV(o# zR-vZ-m0N1ZM71nSyzi=zST`a|Um7af0yC;!7(^Tq#u3zhxbCz@ofV9U4F#ZPqH^%4|xUDu;kP+SYS*AN^M-6>dW=< z1+?^98A@H+Td}*QFLv?u?O?Hy>ylK>wfjXP)Vr-$tmkVeqF_7}pNU`p{u*%&`t&)= zQDO0W2;%0VJj>BH712sm$e`3|e@u|+Q z1v;TEJG!>)XxpovN3y(qBNWz|5>J**l_ znQc|?(&YKwC=Hs8ddYS1V~e_!$*>M080ImLE41ay$0d2Vs7=B3Mws?N`J;T)^i~y&@!^bNbm9-?;J`JYOT2 z=7~TE&v(9(X`To$p3k}_ z-zc;|{M8jq_1}W2_-uHmmW_Yj6z-L>0<(1c< z-1Cv{E0&*pzX8@RSSN~$B^z9cOFjbD4=}E?&fC2(CU8fTT29cPqtl-k`oFlfyo?oj`;99PU5MB%>2e8X8!4cP@CCu58Vr8cvUCK^>iKWU; zt2`fN9;X9$$vjUmkLG3JFW73!lX_f2OzFa?C%ue5) zLn75_mFr#1G7TzBV0nu1b`kd{P#1w=CjGUBugE5kHVc+_#SP zKR!yl`jmWrc$DpW?Wv6a`3Me|=!=D9afcRj_FpH9J2a(c|249>>(VUZ)v}2HlEr;S zK7RxkuKJ4jd7%c?Z zheWc7Kgc2;ksv*sc8fT?jt%)V4nfRW#9b0P-(Sx0x=TanyI>A&@wXB>KRty&ef=0A z^(G0OA4y<;S3cuv+A*J{$t{vje)<#^aCj`V114?j4HcJ7eni&ykFvf;bbX(c_5Gu) z@0Y7s-(QcjzMEF_`G58ip8qVL-@UKZk1PMX0Mo9#O0*DBzqOp{--BDoW^O_7+ov)3 z-ed^t4vsA$=J#s}iyKoRF^SV2jQQ+x#(WD|n%yklL6&HhsAYoB%PbEe%fr~&{V~)w z{Xvi?)ak>J@5yfct?btKbhq9iyY&OvtuM=Nz2Dz0Ka$-eLH7+DBC^GO<8y%ST3B2M z#I>@HYcFfvg22_X3Sc#!ACOgiL00iC`Fz)SD9kJ8^{t~4{xEt`v;MVm3j7MlhUpv- zUy|c|@0bJ@FfFIC_Y1{Q``Y91_s+rk zKU(&>M)iYAjyi%nmjuO2s3Z8MJpS-HSZF+IG5pT`oUP9`{2y3q=UbflSOUKRD*jC# zGWkbH(O}452`hnCvG^fK)DOyAZoYJR51#+6h;Q#b&{L;=;_pH0zHSA}YVq>cg+b^& z@&1YZBMAQ3CRP2(D?_{S>+kPJ)Vmh;?5(aw?34S0FhdD}O!fp;d036dq%6*BEu}DS zIFP60X_W`jKwEtI${zXks!brU4~Yn6{_E{3@f+wJZ1GR8XvMc8e0lGJ?XwZ?@5H^J z0qbYaMYumfHU7M*#_`ek9#Q$?7w(Lp*m?P7OViJ$Kk@5CYJP3?6po7!Un z>-o~qX0yr5uliyl+bNuYjn~GbqM!%a!aZ$f`{7Qe!Nnh^iXEY|+Tx-vbn(R( zAH4X68*aGiY|#^{P`|)>HJ|xiVBW~M$~kAvF9eJ0aj}OJ!*2zPTLX4+th}V72B!#K zzR7GT^Yg*tNuFug+#WmIX(zuXj5E{rn)7_o{J5~d>4i1DX72Md!{YA(_I_UJsy@gBBzkkeI7T1L9 z;%CDwZ=>lsKZq>;vA`}V!T#Ny`}b~mg-BJs4u08Ip91ASkfanzb-A!6*}2C@E@y`y){5J63F+)Y1`LYxBhuopu%E`Hhc1C__MzS@%*)g8WoU6v5n9gjrO~CdXFFFG6D-_T zT^6aPq>Izk`ee=^vwXS8UNd@~LCk9y^#ra_7L6W5qDtfkH0>| zs8=tv*S0wZ8~k>)c&jh!8;p8CqnzUTMQibih4#j>vQfWP$KwmJ0m=^{Vet5!Yu;?R zN}X*)48M3S{sTpg&BV_(vH?GTEv{Px?5ydi9vvOqj>``GlGcwG+ogy0mjh2kuGMek zeRvW2_SL2jaRd{#1NcWUg`$Vu$ur^$Gsyi-A{--7OnrZ`S8T0fK zyWzm4(T12vwu&_&v9DDWhZ@C2RpOIY@cr?I(vH&VmzBJ%q^0=Wib~NO5_?)jBvdb2 ztHk*sv8xqZ*F0)~9bRq*FRLsM3^J(|QBQMM=txx-9=o%k8qw5f9W;$fxX;)kk7b zAz}iBuqV{jhp#IuZ{OWk?BJp-==v4*nghFi(7tVjy*4FdI;HVY*$F}N#MhAL@x|r& zZ!%BkQscZ_6n9zsM6{^`yp|t)nlDyuu*~tok?4HMRpBrAPL7;ixF&fWSeGZR65(vn_>7Cyig>La|_&3oh8TXB|bVdwyEY{tbYsOmMVNULnzuA}#^o)`}`ApRCe z;|W?!*)TKLuddIvR^ruda(m!M*%3UyOFn-q+jGHYu)bjHF7YifkYnrFp}$$mLHKco zd*atDmCT2`xAxOaD2n*cNX6ktQ@6Bl^znB$;kxUEJ#nP?&=QvNrL2U}Yr$YB`s$YS z&8#fx4{JEg*I#-c^88{k^SmK9vQdKJU9fEkSffoG^PXw{$E zp(%j5_!`epC#ciIn9Sx=J51tLGvHZ$YR7N(L<6VUmIM3%kGf3Mxg->4NIhT0f!56X zts4_efiPT#CDMe4a^p?}^__=Fi2ntjGvjq|HFYI*)i{2%&(Y5PjIVJGb{J--4u80^ z29db?dUa{pHb){3GV*?WD8dnZ9YiN%uEPzXy)`kh{Fc4ge&zjJ*-%?)n-R(HW19B_>_|C|5mOkrC^S|hSzKu* z%ax>{P;8RQ0-OevcYN{uj=i-4hts&CE~%>KH^8Um5};mf--rV++i_lclW8%|tl^Lx zs;NU+7qAsg*mPm3lv2Z60Y*OSlG`Adg!``8TRVZ$6Vf2}NCmH}L%|Q?Gd+82YDY^- z%BqXQHJ6%N$N2JJaaCxEiJ4>!J~_Oqt;R%M&8Vjl<-qM`#{9nmySNj~zoT}!hq13O zu-BQ4_c7ufo{0MyflY8{oE~7r$Dz!qR+rA5D=!-DIk8l|wEy{DBzV^FQwN-y?H#{CXg z2bGoWbuOwotsarDDYT(kTA-4J7=sJR+CPaec=8k{&mK3{@mz9vv~INiy6IBq-&xh0 z!=oFkH-<;c@V9z%@5M&DGuePrZZ5ES92^=M{0)Q(Yr-96)iotJ{|z-#he`S{lYXec zu7!16WTaZOj$BYuT;0C2ZFBuuwYAkao!N>H#bEhp+iV1(@hGxfy}&MRz(LbC96D`m zt9HKZeh**111~R*R@6lHLjK|vlSX`df^VPT+gNqI1DnD|#Qxl}OGWsaGG2fbX%*d} zci?tP^>3r}4J0R-`UAFID~geND0m4ETH`7Xn1*P0g<+!WEV^G}@+WP(qC~vezNPLA z@#8Cl`2I}~?z;_c+;)RFeMJ1!suFL&4N1MYAZc+h)+Vljh|6;of53|y0C`z%Yhi`> zB_eLQDtJ1M%|mzDAgyBxlRg~C1T+n&?CPIFV!A`%7@QT;i{w_ z+#V%f9(*0HzY`t7v&7j|qDSW1__sK%ft?8)+(2mygT)4Z-)#m!?!djjXSDAvt|@8T zDRJ+sTqv!bCzi_-%jFSiy#L_J@ez4WNOt-Yu1Z!?!qH#gYRT2{w4I4}ns;jU95q(n!O)hkxf*SRKzVDfdsD__EOR{<6^VAu~s@$jH}h9C7mbR3)B+6<9;(P>=Aq z#ZkYt0`>)p70#QhiPrq0I?D`0j~;fz{fW*w9lA-bWNyjft1{RBtY;sl9Eq z?exGJu#q2=OL=0ht*<{ZFpq(n^hNzOjTicC5yt00I^q9J$vWE%MyUuUX5#;N)}`O&YxDa3|W4!b3f9hB<12sXJs2|?nL9`N*U z#{I7HDjyt*!j1}9d0X6b8TWHOvaSlBxXt0xTD4uY#=L$vPDT}oFG6fs(IZxjh>u^D zx1aRobZbRmt&$rb*oAgHhE+9eM6JV&IUfK8(vB6e?BHpopdxcM;2-t5f5Wf~x;v1qz{NUg<;?0G>6iyII{AEjvT|8wI`HgUVHeBS z;4u;!6EmF5^6V{sGKbmBLLRl(Wj3>%2<&ztJ%S`wzashhF>G0#@4gnaA?AO)F)J8@ zi&%;;ILA=&jg0zefYe?~LLtU{9x={VOBG{Y6|gtPMJYa;9>SNRH^3mQY<U?zTbht^DN0N+^#Hm;8THdvapU zc|Kbv&w@W!)FwSSa%6hyBat4m2tqmsS;XY_@>gS)8v%C9AN1Ts?uxmZbIuMTu`d=h zHlgm?&5u?opMma!H}}we$3$TsG}}k!*#vdv7Fyvj{>lge?QpCSeDwM!B!i!|@ZlEy zHJjft0xGUzBciX4A>xOO&}V|rVZ?tkLT~Y$&xk`dtNZ-karC9*3`ZB#7izCBVv5y~axR!^6^@-108U1!_ z<~zGDT;{}k5M!3EcQ6U|o7OboJ_GCyRXY0;5Ae++Sg>Nw#?Yr2^|&wUaYlXL7xg5g zejTvO$DEA6VbosZ}mkj+Kp82_eGt?s89H!&SBIKeNiuE6poL0n%c^!*AzHW zCjqMhR^^Lzi9A8qk4)G9PcHPwhi96HRe_HYmkO%C5LqHma&XMvv}n*zf&%`1wIdpg zF$Txn+?X6=-i~8zFHtsK0Ul)u@Ek@!WLxq5pT(_)?%pSh6Lx7?SvjuTHfzBXj0Vvy zDR&H?pJvouuw>gD=Mf}L+Sj!s79Y=c4>?sb=4<)sdKim?ww~P4sp*!?WsRxqz~Fe& zQlX|v8JM2TrbZ`|!@;4kfed9T=YN+}J@)%8L;H6|qy0lu)A-o<#1t5v>=-`57jz0q zP3G{Wul|dCD$RDNG#g^w{oP8XNqf`0QjchF+TV~)=lUCygVUqd&fR;0(MTk?Jya2j z1k1yb9pUoGw&0dbay&VZO`aX>LsQF=6N5>ZRSs|6zI8A&FgY|9%p~`xvZ?fBu)K2H zwn+KK!L1XyvFV9H_~=MA*f4xGee1*ygh$5H1G%jOgQ;o&W0(<0Ffz4&+t%#V*5SzZ z;MURL)^<4XJk_I<(`e1sk&)@ip&ZKJnoUYSi@4!|+<-R>ec8~ytvJ*^n$#d8q;}QE z64CnIu)3}9Zc21Ebv1R%xbD=@zGhfpb|0KdHYP_b=z|kTAK5-_#bSxhXf&}ind_2r zbd;=GmWi!IVj79gPpEPm_H^yFShy*qJ2jE)&ZI_1lbPgjJUyJWIvcw?tpOI-5sP)z zw=}j~*x8YRG~F#Rqp_u{z9H6RHK)dN$xO@euGHulGy;>OLHWlw=9!szc63*AU^tm^ zdWAN2&cu^h+3A+VcQkm$Y!^E0>2J<6 zEGS$Rr%UVj8(;P>Q-9&oU(mA8>)#O!K z>oJA*4{$nLIespjcULCR@6_ZdVTDP=r}}I*iQWM^(-}rm8g}XG#G4+;qhnSS&M! ziJu%se|B|RUAbWm4|iA^o0{wQ#Ja8K=6ZB{it~D49FtG=v$>_Y9lZeQpGeN4L~2gd zN4r}tY_dp}IxlQ$3_DL4I~`ZD7Sn$EBfx;rhy>`MN$=e$plT+4}SI-VOEYndEQ&RAJO-pnh9 z=5eUKJ?i2NVb}0b?sTn%Q&JJsj^yMpF;NqOit=eSb=<<8dE-ESc9q|U`^-MQqtD#VE zvKph&u8XYQ`zJ6^doag3GU?HVfou{h1rRvPHy0)|sgZ-xu_V^L=?M!wT#ngVkT05^ z03A!pVEn@RsMXS#Xl(A3KpH>^RmAbwwK_h~`6=r=~%dqp_AoOttQo zPL^Aba@mE(r0j2_Y(Pu2t5X(VZq+w5;~5Q;4QXhu2RNc#EFsDlEzy?xSZogxw5XPL zN8?c$jo==uzNHf(Flq(}nSlvFJCoa$PVck2c6Fd3yI2`o(t(zc&>=%SF6-&)Y9jQf zrsK(pE=iapka-9YL_R=pPrpI>YX@~Q4zBR=G=uBplIkk3VBvNK%jIIEK zd{DBKT;tG=F4b_^T2JfQ(l}cx!J>K_?O+S=0-Q#tHIhkBNZ>`R=JA2-SW^ZA-vyp3 zoyn@0&SZ*}$hVxy@|}hK^Wnr0`2*(4Lk}6(n4U~p7pBK^V81#CCc%SoGq;2lR@F! zy_UtcOpc^2&NSIkOVyp=V&WF%sb987r)n9VQE9pkq(E6zDz{Hu8i4fpE9-DLdOXa{ z)XN3~#odlO^J{22lfep+7{p*CKp%Hq9hd=8;s!GkS7dLf|)7?8}Bd}%6?UGv5GfW&P?OBz!dCBQilk0mEZ!QVSg&|{_AFBy+LQ|Nfof-FY1S@Y}j5uNES3!<7|G z(3t4zXliOq>}uJ$%Sxmtp}tS$5|Hb&vJbKLXj@aGH8_w%8xLZ(;|&HekyN^dV5M-n3_o4Z6@Iua9u8b%pN))o+CSC`_J8o|tGQd3;35}C^L zk#$cDf;n?!06`5}GoaCtQ3K4z767)VIh@$Fn|@bIueB4&*bx-pLev@=7=rMY@llvuR0 zQ^6}YlOPHuw0RkBngET8U{QGtD|M|9pypoNCcfE;9~v1z{PL z+76i#ke0==`(5NMfM&8-0#naRBxs(ESu(qk!X*d+^$E^U62&PA&#v@{DI_~Rn4ZFN z4=m(Z9OPJIx??J0S+H{H9B@SEl_g6#%;05HM;HQmCkFMP#pmvsE+dxi*{!Jxp&pf8 zOzc+(IkinvEzB|!Ho%?5VepAknpVqY02C*SQO9&LL}vmbotY*IJuGnYlvEN!gP@g3 z5H`#OQjq=70H`ia$S#4fB&hO}lZ~jP%N)d7s*n-nnP??>mz|wm-O=utBybZ`Ss(Rj z*{x;@DV#z2#6C{M_`u{e<{??8jDIdB(3dek<&{$oAO+A84T@MMhQ`y`q%{auMB$=> zxFp@N_KS!E!zsv*V5T)XNWx?7+;tI1L4}nV9hg85NJH^trLqZtWY}`Zt!K_c>;pEF zI|PA%@P(BMg-&q(5(1?567&Z0BPmFU4NYA!)C@Z&baYD2N>XtW!3k(8hAa?f%s`SH zwYHF2ktl;LN=&5>fV^nbHOtdB%RFsYgO$n-qakuo6t)=jkrJXITBsBYm^C$aFpyuipseuCev)oXGpOklpdL{1XToe-2r zbep??c36oMa(Uy>Ltsu(_v0nNvMLWN%Oxt_)n@H7G+Zf}u&7z`NzM{t1ebGnC6#0u zc+YCoIx?M+sxE(R29P@xsU~IOQv&R=1Oq{$D61S(%npfNAT&@!PJwyVQ;&T%MBd@O z$U#V%KrW8nrJKd3$A=A`U@=sSxTNT69dv<6N?}b5%uFe*Azx7Nm$PG#73((WdKE=V zVuJ&yjIzeZt;r1NYJ&KYO^l>736OQe3du=IVk#FHa!Oc{NRHH6?W_o#4zaMD6|so& z%9V#1G_*fQP$$qxt_nLFsrS+AYz#7JOQRp^#Ge>AH$xG3V(c)?67rohi72Y~!c#La zAR$ah3WGsy&y9gzxcV*68lD&&-zT{oB!d7l3>nQ|KS3lrxDT|7Ya0j1zsz6-#2oC9 zoSqy$sZf#|4eAxt)|099VAeW-B_EUdnI(&9*rp75$IHu@4QJCZYoP|*8bjX|eQxfu zNRh$hVIg%{OTwGWqnUdYEdcH=1se~jtr<|;fmWHH;QEs3@1=*6-n1{9*-VdGP zAV`_fB5NVJz{CXDMNqI|aEII^bplSyn87JT_QIRq_f~3b=9+RQ2c=E4j*CA0ZtAh2 zyOZHLCaOGSF=TQ7RVLws%F`ZCv@|DnW3Mu*9-&NTiGZlm3OHg!d|;+~CWe0X3{5FY ztjY4Q$=cq%s|kuoG)M22Xo8IlvR3*Ya1Ny>@~W7t!$^g`I(3?&!PT2;JG-FJIAWVS zWt*`?0$5rg!nVYW=>t2Ydyc6>7-G#P>nIt9IY2p-=1#eWwM>MzMJKokA*n)+z2sbA zG`7{Jb4f@2rcz3k5g0Md4{8w2c5v2$B(33VdZ__8M>A%I*bK9Cn3c6n4C|sf>vH}m zy_)+YyX4}nTGhq9|2ZzVtvSrU1JSU0Ra_Mm8~-*hh&`9h92UpaftfF;m&OUki~X1L<8-XjMdQ9*=fa+!wn!8(7a-vnSh)) z?cIAjkQO5|1{s<+7*aMv&O}SLWfG&_k(xx$tahnlQH456JrJ>265FcSaq1xd%Uy7Z zN*#MTu&036O~lpNuTzt9$I7&%iR^AH+SX~2V9J&@L5P)W^>}g^jl$n{P&}s_C>0EJ zJZoW1mye`crsWcC+NX1>^-eUp;YMO^|7*8FM#L%cB*ErcU){4^*G$tH+k|Xe7~ep$as{>&wAvLQgQUO~tSs zXqdCV9dC+v#yeOm8xwI8;Y^^^#I-a=F}hGOMicepI0fm{Qts5Q`-WYm1LYQ4T&dD9 z%SCN_I#lSQiyC*TCvg3d7;FtNU{u-aI(5Hwh-n}+a_^`OJVK|EHX0jt#-n=@N~MYb z@OE-|@Srq?h&E{`dHTFvRd`?k!wnOGa#^BotpTRh)zPA1gPajRw3>RlTV9gTubaAe zdHREXZcjAU>q=oe!e&|=2;F^(9gu8X2yh;C>49M*;#sg@a)vOZ`=-s4*tzj!a!Pg$ zJKxPxl_RkL9f>seTApt1aN$a*#yZe84M$IxDpV>@j0O)d2AHH91`8OS6>!lBlwpkQ zA3L?H3*uBHLFrVXC2E+>!xS2~-X^;Dm0>hK0d0BvF{Ck%A~3Hi~Elu>Z{7HFUPg z?&%H~O}FWO#GRr{-QBq}!L^Y9(Z~R>dO9!L#{txHo|q-el8{jbYR$Nc5SrG^!L9=X zQ&Vyipt~{ZKtO>*51I!TW{#IrH@J5}3prG*@FfV5VE^!4@4O=cySK zJv$@Z^7KG*_k}G{QW=L>5ohIiY5b9$jmEiK%UA9gfRs+dLW^4fF?Lrbq%B1APG=P$ zkO)DU3QcvpZ17BX8H)@L3eI)Lo;QHv{H8p&sjmqfBC6<|962-SFHwz*vo2>Pm_%2CzTG&EwOFszfZ0yT`}lp#h* zo->++MyD|v*MRJ5jK{$WI76q0Vpa}fnjgH4a)g^Z_PCi&`3jxP(jH=5XBWwXciX*f!zDM$07h*4UwG=~i2Ux>@A2sh{g? zXi+w$Mgy>`vOMW#o zJ%z1JQ!Xda45en(k<3U$R}8K6_;_-Ea@za(vwmZbe{GA6Udu0V>hf#5MYm>Epvuz~8-;`BH&caIyB5)<d&{<5r zBT{BcrdAwO4@e+wP7;a6cms^oV7Q{QNl{&+4ohQem_w0AlS+j=wPD6NtkCQRSS|Gp zYQ>gK^CWf_4c3$Y(t=J1_c|q|nL3&ZEldJ7WXg_0by6C~%b~G4>tXAr>-K_}>S4_*ec19!zrt-i`B=BNrcOmDR6{WmYRgfb7*PCs(+qa-p5@9T4`E>OF#wn2 z-;Kov}!9!D5~Y5^6o9P7xT+9O+Zz(G0c?$r z$>NULUs&T!qym_s4lXz9miNY+jn->$33;9cZxK(cXYQk z?S-jWCapTuKDiTSPor)>Ws9V_fWMJA%LMy%V=KxzWniH#N}JP}d=ti|$>H`9X!OD>e z)^VsM4sm=P;xHNOWgY8S$2vA;EX`P7n!Nwty7yY^-upa9)Ht1w!?pO|U+Z4?y4Tuk zfA8nyIlA+bQ%TBs+A}?rIi%~N+>Cc7F^>9f*@6kiI$_oIQa$%-y(E>(&elVHsn;Pl z1K~k7J<<-zq#?j(-sX`a!jaB zRtw!Z?N()Yw%+UrPws~E;cBT&<{EczdOkO|s;%Yh^&F=Xd$I8Bc6HQt+4}R>hufp7 zRV733R9x_-oJKusdiFxOt-NqMgd5_sib$QrV#v z1EBUm%W{)?p^%lZlzvV&V&8c>B2BoEskn8n56ywycyPEZGj?eI_^$Ff?B2TohCXi2>79&R#L z_fvGIhYstOY`DM9okm>>oOQk~bE{LjnM(I@te43aue(aq8YXx+O*{QB4TZz+a1Z&k zvs&Tdjj962o@ZPxCl}{a7re*#wALyxB%+428vK&>8eH4Zok64uNgK!N>Ryt?6+&9c zt9F%zvKVeP4d`l;`O-nI-Cs_T+Xbk!Sj7&7!{LD|F4QT!ZjM|WYV-Jot}I-5rJY`J zoW(Pup9#v)eLHSWH*;q#3Mx)>t<|`8R4F5k^wYAfC&qF@C67;@R7sGBD2YKT>v}6i z%N`~~Cz~@aKdqI542mGs1#wqvs5;0l1{N^v;eR(en#*w%!G&B_}p*UB0k$35)*bn78z?7Zod zJqC1s^}1X%)Uc|iu6abk8G~n^u}rs?nwKfUV%qsk|++7e_*5G{aU|Ev7M?t^i&4j`Rs&3%C{$+C zTp^^`wG{t5JJ99hJgaSi(QDYndYxnu$3~7?$V6N3XKOva2mknuCK7Zh}AsvODarUyLu?Lx=^MTU_&RC?^_7#3?Cd8?SaP^M! z2HnR`mS+quI(x-w?ay;(thH2r2f`DE$-sr46QjtO;fm}X&m22I#1+$H(coZ8unxE{ zW>wNbBliO|YX&a4`VwB+U%zhM`hvTiVa?J{DXw1k%RCEru^yU{Sb1K$RH<0Hw8ejA zp`D(YE(jOrSmJ>v?%h!Cbxi ziegD@!yb~5-%3x7vvhC%lB)|fs0)R^q_Y>=408^x9dWDc-0yJR-0-ChdNg|VFYEg0 z7vEuG`Ec&))IhcCp#|6PDn3%5Vh;L6*1wpSI5z4;b$lBoTFb*n3&Pf{OxuaRQgMa` z@e+N}g3}8-ABur#HdoCZ`3MdgL3$Y# z6{jEdpbo=PdA&xbdP_A$_yj`?L#}h+QMk#jB8Y zc*@1$_+W~UM>5TVlg>ZAt$X)6MP039em2l(t4*z?$7Hycq042LtY4emm`cYJdcY<0 zDAuX67};=G5YDfw%_}P8V8LQ}KY!NwpDwC*DHSSh=a|~|1(R-3+1bY1Ujp>#LHKHO zez?fG(9-RNVsQDQMW<=T4hwGX`6qoUOT$JOdL+Xt|JtX8VXd-Vjk@mbGdPUPz!kbq zefjxw=AMP4suqtku(^eS%i?fl*Tg)q2hB%DQ~^Fu4|*aPY=rqp!tW7Cv{8 z8`houVV&2mKu@r7c=x5~U0tlEhQ2A2Qe2bjsn5@8vV_+~(;SNfFf50aw=~dI4o7U( zXSS-_C5(2lVa;Wi`4r1Grm^ZY39-FNamj3Ny81%TQSlw@P_&ua{v@YX%RwHEFu*aA zDm~$26*>F5|E$+v^XfP|tFF?!o_T{}#zt4>Hx83Fop2jI*9;F(MdKV>5NE4u6Ri@< z#$9dwH07M!Wt$!xvm(OhGO zcR&(73lmn5n1!p?=^YLoLhEgiOD=Oha=dY)7#>(-ek#r|>3ug?)QS!3*IaVZm3px- zMM$RV{;EArmHTSBaJjF-4pSm8G0s3$;@B{$8?mVhd5p({RqwK+upw8CW9S^~zJxt_ z=f^hgFtCfw>ew$e8zx@tqCSjurCwr8y&u-PzEe>hXV}W=Ti1|ro>tG6B8<~0PK#xy zUsJHr3^R<=&>2?bRU?JP%xNT$7CGMf>1`fvtrGV z#4Gi-OHPq4>gz~FN9iOtB$F#(eDNV4e%Cd2aBBN?U8L8&rcgmg2D)yROm(=h! zutPNES=ZY&JZp3k@Qx0TLMj~FJ2Cme@H!FB&mCFz^2?Gue=w0HqtHXQCsKO&hdgW=6&hqreQ#v)#|H~Ws9?t5uVX*ZEVl{1a z@+G@)Ek}3w7U%`iMS6}~Z}FWTIwfw|=k;1oNSN*q@IqX2I)_X6ip8#iqzSYroXq=F z59sR(8X+vyRea>Wb1B@;a+VNryxPfRSUk9Nu*K@BXRv4|MZ$1OFua}gc+Wt5Y5!eZ zY~z<@!aImdR-d+>ZiJTubqRv|#2Yr)Y@;tqjzYLn7nXGpy?QNUw08ZK8)t=%#;bk9 zBheUW`^B1J(B`MHsXkdiF9*2IT1{qc;k?kxHOeK6^^qwp5hNx-U_Ybi>oZoyo& zuDbI)s6%>kU1`$-#RpWvIuOoj!&51RF6}KHq+GDuCN>ov+GorPPi&w5qUG-mDW2B$g>4@YFa`}Gq& zYf_`)nv8y`bDelaxi(a!tlB?SomTvWbJAtu`!}S#7G_)*s-eg!=OUtN>hwByurg96 zYNtZl_;inj53RZToLc0P+}#XILhf>$)~XF@m)}D(^X(^)RdUH74SVjTnD)Db_+!IP9htuHk3EjRm0NBBC5 z)#Cc1%zd|sTuVaum{DwBH=k07w*QD4ae8Y)xmE&_Nm!`Ke|pP%BR7OowrL`TCPqVB zyY*p?+E-mZqz8rL4J=*g-?)xJ_M=gW^0)_YwajQ}7wfY&dWOo}YO|}l>knJs#_Wtg z+a0^EEQySF!q@ZWbx^Tg>lM{N%O*B{)#aCjhjgP&qZ{GkWpbePrP_&yZ7<(mOXHn- z5!;D@MF05>^5oUs=MLG_^^Wkpi29Y2L#HDCBx|)RiYtEgF|I1D8^ZaO-dL~RbkUY= z_F;}|oV3bRCm``+KIc!YVfoagrjcW=aoV{9yJK4`>w8p$ zF>?SrecLB~nkE~ijXGA*CaSln%d2!yqt68R51`~qa=LghxYcNcRr>-(5LfNsDU5GY z>D5ghEvZF2tQoHjD``WZLl=`MT^h{|7skyXG${9aLMO(v+I|6sr;Wl)=J-_~tx!Pm z+Yq5Q@)T}k%hOtYWoU!ll?y6mFVyr~sLbt{AU4C|rfy?97(N-ZOvjj^y577ri8kWq zMkrmkkB`K9dTML0QKfBJdKYsZg!f8hDql)j## zPd{Xm_;HT+_S0lDOJ#!e*9aGmKYH_+8xFg%_ba2f^n88Pg7MR@9DlUr(Qb?Ewu@gd ze!}M78%Ez4Z07fzK6d*D#b_!y}zPGpN>ksl2XVOU=;&go&mPh<7(GS{9 zlb-?e^P9b!N8b?JMz>bF9uJF4{x~0-B z9^cE%m~hVc-i70fr&2rP4lnvvO3&C}zeYU1;+VyF?v$Ldg!glidXMO*0Pn5zv0ju* z9e#wbDc>=I{X-+jca0$5GlG1tKBSu2*Eoc0#=HcRe`ZH%-(YLLkBiFR`q;zY8Zk(+w3&tP4cKo2O4Dy4LTORT}qiuBa zKVaK&l0+-)huDN4@i^dVU*?y3Nux^BQ$~q?<1v z-RkvC9Im5pw6{dMX`$ZHzd2^}VK?;NIQlDbKa75z^nPx{_HOCoGwSw9cU~iw*zZ|K zCV%NzgLYO*PW_n2Xun?aZuz}da{3VSyG=ZGBEMZc^CtM92I@yIGU0 zpYTmT+X+~IF%Hk;7k<9#&lD}cVV+0%I?0!Ikv}APbAKKEGJeDndFUn|{Yw>&dwqX= zJ$%9MReLu7>T5}~WsH3rO`fsw`esZ``=fHWQ=tz zIgpPBdhQ%w{K@X`*l{N|{P{Xdj?#QlowLS={pyXQdOkn)@$cw3LuV+A8Fe;(X!!OY zb@;nLrMXVUwixS$HWypti``EVLew2E+WT1<{PZmw8(Oz@B@$H@L_=k_q`>kkCJgh%E513$Z~uVS z%gHuQj0^l+@vB5v<8rQ4fzF&&Qafeav^{oAv1rb)p{ou$@%bfTFyA1bNkubj}d%=Lh@xIMP!f_rx z{G6XD{bZK3CavE%zWB?{w!{SRc% zyrfU?`^6s<=H;Y(biH8w{0qm9pTtEy+Qsh3eyc}(@RP*P5Pf=eTt=UepDOu$(SGhl z-F4C(BVD!sJS*-$smEX3e%^|YzV4K-gQ}x;YUkb5z5Qe98dtiG5c~0V+j+0;W4@Ju zzGr(!-p|DRzIeQ?M=`%qKIY@y1cnk&7&)r6S1De1;;qm_BMnr<^i1! zztcK3l03$X{TLN^za7!moDXULpg5L@uJ*$haCn3*x_L9~94hhy;>mU7MW+25_UojN za~Yn$$T!>GQR#;o`-VBH6LtG^?N7(RF|XPMjsDY7O2&5{e~M+ix)eVUt^@bGdfP<1 z?PJ0CS*z2v;^;fBxt?e4M1EiJQJ*_AoqmntcCqz*Gscy|wLIZ(z4AiN7^~>NUv%8p zj3lQ{w0}~x=UJ;gPoBLWw!7#bJD-2}Ss&JZU2$Ejeqam##?NSfY~x|c{mQ7GuZ{h; zk5`Axp*`&Q<6N_w-!0Nl|5@ADqKD^iu1e&0NYDI>{GJB?LW6%p{DAD~AO7Z@n9hyU zwE*O6CGVGw-&Z2vBKa+$U->=?@+q^5zT3OV<)W}W)a{X9qoQp#?VIq!-+YzWANW>- zXB&(0qd!k2`tfq|6vu5Oxo>Bs?7baxIM(-e#N+LDjbPV|b0mL$JmjjFqZ0c=yUqD_ z=SQ$o49YiS5C70fX};C=SJ4)`XiMG2DrdOs=d=@Tp}Vzvv^wz0Y`Z7JJcpn5NzHrF zS|hZkY##IV!_FD|)NUBgmdy`#cgpTH$8VjJuT7%gR`KK&{%-NJg5NwpknfW`uAA@& z#S;th!uNlw=;MX}b>U};-)Y;SPRllrz2S%(`@VAc7RA}KYwS~d!Uh?GjXqvFx#*j! z`u&xU-cQ>x)`ECFU`;-Mi8eAVZdXY*7Z10&rRisNwux=y=RB2u72=;ZSNn|+e|7G( zHrJ6l*v$NlIJ=cD4!qx~v|$@AjAFYlkD?FG{H%Px-X_2Q`)x2-6@ts#%~ACSCH_K|;B`~=58 z(cqsIACD`D{WbAicUVBb%6h*f4)+A3?<0S{-qsZHb7d3zIV66S_~7e;v2wQHeNiWI zSi6F5h3V9M7$bD2s#Igdk@eB%RrhL$kw3Oc<>VLQwI1eq)V&sTnyLN2*|+)d8<@YV z$3FF)-G5STYB7g03;PrKIfLyW_6s@3IzFD>=A7ta@B79%Lg-u1#UY8_H``!b6GRp( zo4yr!&+plU^FFT&KJ$*=`*Kh8k$G`6rZEgOT?u)AJ6GiJ>hkfLrE?b6U zS9Cv+j(jWLbngcFk*C`FN5A0v#W#;}k@H78&HBiDRbu@as?RvcE*&3Gf1qk7%45uJ z$yq0w=Wf*5F5N8+U2JFmXN$gPtew!G=Z*rIqscGRK3KVR{_9`e^EXIqbU zlNVS$*@ay6SM^VneEulf4f}$yhMYfk{5W>BTPjN}Us?m1TJtf^F9d!G+`ejQyFD|zB7v^)9 z&)eyNjhD|mF+ZY>V)E%}&W8L&`5ehvLt_4;T%v;geav^14~$?xB)K2|Xn*Mla{Tw1 z|8%VD<0cOqkJG(q)o%qm?Weww_fzQjyHka^yi{ncja8Zp_}MA>EVB>t7~e~hGgk1v zKg4+S$8{_rz0X^eAC#PN^l@Q7X=!Rdt)IweNKP9~`?-?OF?os?`*kD8@06T1Pkw6l z4~*dd(GlcNNM4OY&Cl~A$PY-qQSDaORYJaqbM0BS&x(1uReZO8s_L+9g8FyKp8mx8 zJH>a)_wEto`$mwzBzbcl(B7LP*b`s3cE>L39?#?v}TLFWjv zgO2>#if0a@*C#6aP8L1DytrZ1a;`f>-FE5bNaxpE@=d)Lq=WYJ68QniStFYAqt8zJ z)HH9fpCfrU`;`rOvwy_6X@;(+$Zkn!FYotx=JV?+qly;r+kqSec)GK<_?uC!j;e$| zY_|r362M?oxJebXH;Ub^(o@XpfTnI$b;HA_%R-G7PzJIM;I`h-97&c2gA#}aWs0ON z=}<6etrYx%k+G>)dz3$k#uRt-D*I0kmrvZhY16MKZ#-w)uc90PTU6@tU~p_OD1qw& zxg3bLIkars&bH@x+jgyC^E;SrS9;sQWP74oo2^26!8t0UiuTC@f)E+I8ByJdWW764 zI;tomi9zl|lsczwpu0Wf5O@_CrkYVr%6-AaS z4N>V?lSc2ih^1{h4q~E8(LLg5%CqBhLvLHa;y|td&NL}7WK!VsCIxOZDe!fZ0=JqJ zV9ecQ$xW3swJd0d036#E4z(gEO5lP(4gokc8>rh%0nmymhWDvWLl*rxIr=uyo9lDD z>vku*KF7PxDcxoM#gBe zvl3_2(~_C1msBSsZXsPO(U*f^3-}F{(Z%{}I}kUjSO`#CR5Uw)o00-*t0@4sHmeb1 zS}O^@v~Tb(%MLCvcRLNLY$awnQfPQ+ZZW`i=~uv~P~0F*=rCQp`_NaEi>Pszmur(Wf{*=8CsQeq=ob z_*aF2v5MjY2)7;|H4mu77D81jH6r<;Y~J*CRnyyL`=E*%0A5nD2B7wv0^mIow^OCs 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 IlVvjd9~*43#sB~S diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.srec b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.srec index deb4d668..b1548ef5 100755 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.srec +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/Debug/openblt_stm32f746.srec @@ -1,45 +1,45 @@ S01900006F70656E626C745F73746D3332663734362E73726563F8 -S3150800000000000520A54A0008F54A0008F54A000838 -S31508000010F54A0008F54A0008F54A000800000000FD -S31508000020000000000000000000000000F54A00087B -S31508000030F54A000800000000F54A0008C109000852 -S31508000040F54A0008F54A0008F54A0008F54A000886 -S31508000050F54A0008F54A0008F54A0008F54A000876 -S31508000060F54A0008F54A0008F54A0008F54A000866 -S31508000070F54A0008F54A0008F54A0008F54A000856 -S31508000080F54A0008F54A0008F54A0008F54A000846 -S31508000090F54A0008F54A0008F54A0008F54A000836 -S315080000A0F54A0008F54A0008F54A0008F54A000826 -S315080000B0F54A0008F54A0008F54A0008F54A000816 -S315080000C0F54A0008F54A0008F54A0008F54A000806 -S315080000D0F54A0008F54A0008F54A0008F54A0008F6 -S315080000E0F54A0008F54A0008F54A0008F54A0008E6 -S315080000F0F54A0008F54A0008F54A0008F54A0008D6 -S31508000100F54A0008F54A0008F54A0008F54A0008C5 -S31508000110F54A0008F54A0008F54A0008F54A0008B5 -S31508000120F54A0008F54A0008F54A0008F54A0008A5 -S31508000130F54A0008F54A0008F54A0008F54A000895 -S31508000140F54A0008F54A0008F54A0008F54A000885 -S31508000150F54A0008F54A0008F54A0008F54A000875 -S31508000160F54A0008F54A0008F54A0008F54A000865 -S31508000170F54A0008F54A0008F54A0008000000009C -S31508000180F54A0008F54A0008F54A0008F54A000845 -S31508000190F54A0008F54A0008F54A0008F54A000835 -S315080001A0F54A0008F54A0008F54A0008F54A000825 -S315080001B0F54A0008F54A0008F54A0008F54A000815 -S30D080001C0F54A0008F54A00089B +S3150800000000000520994B0008E94B0008E94B000859 +S31508000010E94B0008E94B0008E94B0008000000001E +S31508000020000000000000000000000000E94B000886 +S31508000030E94B000800000000E94B0008C109000868 +S31508000040E94B0008E94B0008E94B0008E94B0008B2 +S31508000050E94B0008E94B0008E94B0008E94B0008A2 +S31508000060E94B0008E94B0008E94B0008E94B000892 +S31508000070E94B0008E94B0008E94B0008E94B000882 +S31508000080E94B0008E94B0008E94B0008E94B000872 +S31508000090E94B0008E94B0008E94B0008E94B000862 +S315080000A0E94B0008E94B0008E94B0008E94B000852 +S315080000B0E94B0008E94B0008E94B0008E94B000842 +S315080000C0E94B0008E94B0008E94B0008E94B000832 +S315080000D0E94B0008E94B0008E94B0008E94B000822 +S315080000E0E94B0008E94B0008E94B0008E94B000812 +S315080000F0E94B0008E94B0008E94B0008E94B000802 +S31508000100E94B0008E94B0008E94B0008E94B0008F1 +S31508000110E94B0008E94B0008E94B0008E94B0008E1 +S31508000120E94B0008E94B0008E94B0008E94B0008D1 +S31508000130E94B0008E94B0008E94B0008E94B0008C1 +S31508000140E94B0008E94B0008E94B0008E94B0008B1 +S31508000150E94B0008E94B0008E94B0008E94B0008A1 +S31508000160E94B0008E94B0008E94B0008E94B000891 +S31508000170E94B0008E94B0008E94B000800000000BD +S31508000180E94B0008E94B0008E94B0008E94B000871 +S31508000190E94B0008E94B0008E94B0008E94B000861 +S315080001A0E94B0008E94B0008E94B0008E94B000851 +S315080001B0E94B0008E94B0008E94B0008E94B000841 +S30D080001C0E94B0008E94B0008B1 S315080001C810B5054C237833B9044B13B10448AFF37B S315080001D800800123237010BDC00000200000000025 -S315080001E8C44F000808B5034B1BB103490348AFF3CE -S315080001F8008008BD00000000C4000020C44F0008A5 +S315080001E8B850000808B5034B1BB103490348AFF3D9 +S315080001F8008008BD00000000C4000020B8500008B0 S3150800020872B6704762B670472DE9F04184B0044665 -S315080002180D4617469846684602F022FE164B02997E +S315080002180D4617469846684602F02CFE164B029974 S31508000228A3FB01318909002201E00132D2B2112A61 S315080002381DD8124B13F8120003EB420393F801E09A S3150800024800EB0E0303FB0443B1FBF3FC03FB1C168C S31508000258002EEAD11FFA8CF32B80013B9BB2B3F52B S31508000268806FE2D2387088F800E0012000E00020AC -S3150800027804B0BDE8F08100BFD34D621004500008F1 +S3150800027804B0BDE8F08100BFD34D6210F8500008FD S3150800028870B58CB00022ADF82E208DF82D200CAB59 S3150800029803F8042D0DF12D020DF12E014FF4FA7015 S315080002A8FFF7B2FF002835D01D4C1E4B23600025EA @@ -50,7 +50,7 @@ S315080002E808F90695079508964CF6E0430193029592 S315080002F84FF6E073039304230493059509960E2392 S315080003080A9301A9204601F09BF9204601F02EFA26 S315080003180CB070BDB521044800F034FDC4E700BF31 -S31508000328DC00002000640040DC4F000810B588B0E7 +S31508000328DC00002000640040D050000810B588B0F2 S3150800033840F2E1730293002304930593069101ABF7 S31508000348024602A90B4801F03FFA08B108B010BDE9 S3150800035800F026FB00F132040199064801F0A9FAD3 @@ -69,7 +69,7 @@ S315080004182246531E9CB2002AF2D170BD38B505464D S31508000428002401E00134E4B2062C15D800F0B4FD26 S3150800043804EB44029300094AD358AB42F2D804EBBA S3150800044844029100054A0A44526813449D42E9D277 -S31508000458024B0B44187A38BDFF2038BD28500008CF +S31508000458024B0B44187A38BDFF2038BD1C510008DA S3150800046808B5C1F3080353B90368994209D040F897 S31508000478041B4FF40072FFF7C1FF012008BD0020D6 S3150800048808BD012008BD2DE9F041074601F0A2FB89 @@ -133,12 +133,12 @@ S315080008180A0407E0012363B900F0BEFB00F0C0F83C S31508000828844206D3034BDB6913F0800FF2D1002309 S31508000838F1E710BD0048004010B588B04FF4614391 S31508000848019300230293039304930C2205920693BB -S315080008580793054C01A9204602F0AAFC236843F031 +S315080008580793054C01A9204602F0B4FC236843F027 S315080008680103236008B010BD0048004070B506466D S315080008780D46402904D82846FFF7C4FF00240BE094 S315080008888121074800F07EFAF5E700F085FB305D20 S31508000898FFF7B8FF0134A4B2ABB29C42F5D370BDDA -S315080008A87C50000870B5254B1C78BCB92448FFF75E +S315080008A87051000870B5254B1C78BCB92448FFF769 S315080008B897FF012801D0204670BD214B1B78013BC4 S315080008C8DBB23F2BF7D800F06BF81E4B18600022F6 S315080008D81D4B1A700122194B1A70ECE706460D468D @@ -167,35 +167,35 @@ S31508000A3862002244D100104B0B445A7C1B7C9A4214 S31508000A4813D00D4B0B44DA6815705A7C01325A7468 S31508000A58DA680132DA605B689A4208D9064A0846B3 S31508000A6851580244D160012038BD002038BD012004 -S31508000A7838BD00BFA85000089805002008B50146EB +S31508000A7838BD00BF9C5100089805002008B50146F6 S31508000A88024B1878FFF7CAFF08BD00BFCC0500203F S31508000A9838B504460D46012804D94FF4F1711348B0 S31508000AA800F070F904EB4403DA00114B13445B7C3D S31508000AB8BBB162002244D1000D4B0B449A681278E8 S31508000AC82A705A7C013A5A749A6801329A605B68A5 S31508000AD89A4208D9064A08465158024491600120A4 -S31508000AE838BD002038BD012038BD00BFA850000811 +S31508000AE838BD002038BD012038BD00BF9C5100081C S31508000AF89805002008B50146024B1878FFF7C8FF85 S31508000B0808BD00BF1006002010B50446012804D900 S31508000B1840F20221044800F035F904EB4404E200E7 -S31508000B28024B1344587C10BDA850000898050020AD +S31508000B28024B1344587C10BD9C51000898050020B8 S31508000B3838B5FFF743FF1A4C4021601CFFF756FFEC S31508000B482070184D4021681CFFF750FF287023783D S31508000B58FF2B1BD0FF2819D0134C00221349204617 -S31508000B6803F02AF91249204603F04FF9012000F04C -S31508000B782AFC204603F050F9D4F8980201F0ADFD96 +S31508000B6803F068F91249204603F09DF9012000F0C0 +S31508000B782AFC204603F0ABF9D4F8C40201F0B0FD0C S31508000B8800F02CF9B0F5FA6F05D338BD8521094868 S31508000B9800F0F8F8E0E74FF4FA6000F019F9F4E71E S31508000BA8CC050020100600205406002070000020FE -S31508000BB80C000020A850000810B5064CD4F8980276 -S31508000BC801F09DFD204603F00EF9002000F0FBFB1E +S31508000BB80C0000209C51000810B5064CD4F8C40255 +S31508000BC801F0A0FD204603F051F9002000F0FBFBD8 S31508000BD810BD00BF5406002070B506460D463F29CD S31508000BE80AD82846FFF74AFF012803D0BD210E4830 S31508000BF800F0C8F8002406E0B9210B4800F0C2F84E S31508000C08EFE70134A4B2ABB29C420BD200F0C4F9A8 S31508000C18305DFFF733FF0128F3D0C621024800F0FC -S31508000C28B1F8EEE770BD00BFA850000870B50646D3 -S31508000C380D461F4BD3F8980201F0E2FA1D4B1C78B3 +S31508000C28B1F8EEE770BD00BF9C51000870B50646DE +S31508000C380D461F4BD3F8C40201F0DEFA1D4B1C788B S31508000C489CB91D48FFF756FF012801D0204670BDFC S31508000C58194B1B78013BDBB23E2BF7D80122154B03 S31508000C681A700022154B1A70F0E7144B1B780133DB @@ -203,29 +203,29 @@ S31508000C7811481844FFF73EFF0446012801D000240E S31508000C88E4E70E4B1A780132D2B21A700A4B1B786F S31508000C989A4201D00024D9E709493046FFF7AEFB46 S31508000CA80022044B1A70054B1B782B70CEE700BF41 -S31508000CB85406002030090020F008002031090020D9 -S31508000CC8F108002030B583B0144B1878FFF71CFFDD +S31508000CB8540600206409002024090020650900203C +S31508000CC82509002030B583B0144B1878FFF71CFFA8 S31508000CD808B30546402800D94025002405E09DF8B4 S31508000CE807200F4B1A550134E4B2A5420DD90DF168 S31508000CF807010A4B1878FFF7CBFE0128EFD04FF407 -S31508000D08A371084800F03EF8E9E7ABB2044A812126 -S31508000D18054804F08EF803B030BD00BFCC050020A6 -S31508000D2858050020A85000085406002070B5044647 -S31508000D3803F054FF064621460F4804F028F885B202 +S31508000D08A371084800F03EF8E9E72B46044A812112 +S31508000D18054804F008F903B030BD00BFCC0500202B +S31508000D28580500209C5100085406002070B5044652 +S31508000D3803F0CEFF064621460F4804F0A2F885B20E S31508000D48002401E00134A4B2AC420CD2315D0B4B4D S31508000D581878FFF763FE0128F4D04FF4B4710848F1 -S31508000D6800F010F8EEE703F039FF402302460121A8 -S31508000D78014804F066F870BD5406002010060020E5 -S31508000D88A850000808B500F007F9FCE708B500F010 +S31508000D6800F010F8EEE703F0B3FF4023024601212E +S31508000D78014804F0E0F870BD54060020100600206B +S31508000D889C51000808B500F007F9FCE708B500F01B S31508000D98F7F8012803D00B4B1B78012B00D008BDA8 S31508000DA8FFF7FEFD084B1B68084A1268134403F54B S31508000DB8FA739842F3D30022024B1A70FFF7FEFA29 -S31508000DC8EDE700BF38090020340900203C09002057 -S31508000DD8014B1860704700BF34090020014B18689A -S31508000DE8704700BF3409002008B5054B1B78012B4E +S31508000DC8EDE700BF6C0900206809002070090020BB +S31508000DD8014B1860704700BF68090020014B186866 +S31508000DE8704700BF6809002008B5054B1B78012B1A S31508000DF800D008BDFFF7D4FD024B1860F9E700BF1D -S31508000E08380900203C09002008B50122034B1A704E -S31508000E18FFF7EAFFFFF7BAFF08BD00BF3809002049 +S31508000E086C0900207009002008B50122034B1A70E6 +S31508000E18FFF7EAFFFFF7BAFF08BD00BF6C09002015 S31508000E2808B5FFF7C7FA00F0B3F8FFF797FDFFF71D S31508000E38B7FC00F00DF8FFF7E7FF08BD08B500F0A6 S31508000E48ABF8FFF79FFD00F017F8FFF79FFF08BDFF @@ -238,7 +238,7 @@ S31508000EA8C5FE012814D003B05DF804FB01220E4BD9 S31508000EB81A709DF807100B4800F0FCF9E5E70022C0 S31508000EC8094B1A709DF80710064800F0F3F9E3E78E S31508000ED80222054B1A709DF80710024800F0EAF935 -S31508000EE8E1E700BF400900200000002008B5FFF729 +S31508000EE8E1E700BF740900200000002008B5FFF7F5 S31508000EF863FE08BD38B504460D460E4B1B78012B14 S31508000F0809D00C4B1B7853B10A4B1B78022B0BD014 S31508000F1800F0C8F938BDC9B2FFF708FAF1E7E9B22F @@ -250,56 +250,56 @@ S31508000F68022B05D0032B05D0012B05D0402070474E S31508000F783F2070470020704708207047000000206F S31508000F8808B500F085F9034600B10123184608BDDF S31508000F9808B500F00FFA08BD08B500F010FA08BD44 -S31508000FA80022014B5A70704780090020034BFE2225 -S31508000FB8DA7018710222A3F84420704780090020C5 +S31508000FA80022014B5A707047B4090020034BFE22F1 +S31508000FB8DA7018710222A3F844207047B409002091 S31508000FC810B5054C00232370FFF7EAFFFF23E370EB -S31508000FD80123A4F8443010BD80090020064BFF22DF +S31508000FD80123A4F8443010BDB4090020064BFF22AB S31508000FE8DA7000221A71597859719A71DA711A7277 -S31508000FF80622A3F8442070478009002008B5002077 +S31508000FF80622A3F844207047B409002008B5002043 S31508001008FFF7D4FF08BD0000074BFF22DA70074A2E S315080010189A6400221A715A719A710722C3F807202E -S315080010280822A3F84420704780090020D0500008F9 +S315080010280822A3F844207047B4090020C4510008D0 S31508001038044BFF22DA7042689A640122A3F8442016 -S31508001048704700BF8009002008B53120FFF7AEFFBA +S31508001048704700BFB409002008B53120FFF7AEFF86 S3150800105808BD000038B5084CFF23E3700025257144 S315080010686571FFF769FFA071E57125726572072337 -S31508001078A4F8443038BD00BF8009002038B5FFF70A +S31508001078A4F8443038BD00BFB409002038B5FFF7D6 S315080010888FFF0E4C01252570FF23E370102323716B S3150800109800236371FFF750FFA071FFF75FFFE07148 S315080010A8FFF75CFFC0F3072020726572A572082354 -S315080010B8A4F84430FFF774FB38BD00BF8009002048 +S315080010B8A4F84430FFF774FB38BD00BFB409002014 S315080010C838B505464478FFF737FF0138844210DCFF S315080010D80A4C6A78A16C201DFFF790F9FF23E37084 S315080010E86A78A36C1344A3646B780133A4F8443074 -S315080010F838BD2220FFF75AFF38BD00BF80090020F7 +S315080010F838BD2220FFF75AFF38BD00BFB4090020C3 S3150800110838B504464578FFF717FF0138854211DCDC S3150800111861680A4DA9646278281DFFF76FF9FF23ED S31508001128EB706278AB6C1344AB6463780133A5F84B -S31508001138443038BD2220FFF739FF38BD8009002022 +S31508001138443038BD2220FFF739FF38BDB4090020EE S31508001148F8B505461746002406E015F8013B1C4481 S31508001158E4B2FFF721FF31464E1E0029F5D13C605F S315080011680120F8BD10B5084CFF23E370E21D41685D S31508001178A06CFFF7E5FF207100236371A3710823AC -S31508001188A4F8443010BD00BF8009002038B50546CC +S31508001188A4F8443010BD00BFB409002038B5054698 S315080011980D4B9C6CFFF7D0FE6A1C411E2046FFF7D4 S315080011A803FB60B1084CFF23E370FFF7C5FE01385F S315080011B8A36C0344A3640123A4F8443038BD312042 -S315080011C8FFF7F4FE38BD00BF8009002038B504468D +S315080011C8FFF7F4FE38BD00BFB409002038B5044659 S315080011D84578FFF7B1FE023885420EDC114BFF222F S315080011E8DA700122A3F84420617851B9FFF7ECFABE S315080011F890B93120FFF7DAFE38BD2220FFF7D6FE70 S3150800120838BDA21C074B986CFFF7CEFA28B161784F S31508001218044A936C0B44936438BD3120FFF7C6FE25 -S3150800122838BD00BF8009002008B54168074B986C8F +S3150800122838BD00BFB409002008B54168074B986C5B S31508001238FFF7BEFA30B1054BFF22DA700122A3F890 -S31508001248442008BD3120FFF7B1FE08BD80090020FB +S31508001248442008BD3120FFF7B1FE08BDB4090020C7 S3150800125808B5FFF7B3F8034BFF22DA700122A3F8A3 -S31508001268442008BD8009002008B589B2FFF742FE68 +S31508001268442008BDB409002008B589B2FFF742FE34 S3150800127808BD0000054B00221A709A6483F84320BB -S31508001288A3F844209A705A70704700BF8009002056 +S31508001288A3F844209A705A70704700BFB409002022 S31508001298034B1B780BB1012070470020704700BF2D -S315080012A8800900200022024B83F84320704700BFBC -S315080012B88009002008B50378FF2B04D0354A127830 +S315080012A8B40900200022024B83F84320704700BF88 +S315080012B8B409002008B50378FF2B04D0354A1278FC S315080012C8012A14D008BDFFF7D9FE324B93F84330EC S315080012D8012B5AD02F4BB3F944100029F2DD1846D2 S315080012E8012380F843300330FFF7BEFFEAE7C93B1E @@ -313,26 +313,26 @@ S31508001358BBE7FFF743FEB8E7FFF732FEB5E7FFF747 S3150800136815FFB2E7FFF732FFAFE7FFF773FEACE703 S31508001378FFF75AFFA9E7FFF76BFFA6E7FFF764FE33 S31508001388A3E72020FFF712FE9FE71020FFF70EFEBF -S31508001398A0E700BF8009002008B5054B1B6913F4B0 +S31508001398A0E700BFB409002008B5054B1B6913F47C S315080013A8005F01D0002008BD00F03EF8012008BD06 S315080013B80008024008B5642000F008F808BD08B51A S315080013C800F00AF808BD704770477047014B188047 -S315080013D8704700BFCC09002008B5FFF7E1FA0E4BA5 +S315080013D8704700BF000A002008B5FFF7E1FA0E4B70 S315080013E81B6898420FD30D4B1B786BB901220B4B20 S315080013F81A7080220A4B9A61FFF7D2FA094B1B88A2 S315080014081844054B186008BD0022044B1A704FF49F -S315080014180002034B9A61EFE7D0090020CE090020A5 -S3150800142800040240CC0900204FF40002014B9A61DF +S315080014180002034B9A61EFE7040A0020020A00203B +S3150800142800040240000A00204FF40002014B9A61AA S31508001438704700BF0004024010B5094B4FF0FF3251 S315080014481A6200241C625A625C621A611C615A613B -S315080014585C619A619C6103F0DDFA204610BD00BF05 +S315080014585C619A619C6103F057FB204610BD00BF8A S315080014680038024010B504460E4B18784FF47A73C4 S31508001478B3FBF0F30C4A1068B0FBF3F000F008FB76 S3150800148868B90F2C01D9012010BD002221464FF05A S31508001498FF3000F0CDFA054B1C60002010BD012076 S315080014A810BD00BF0100002008000020040000202D S315080014B808B5032000F0AAFA0020FFF7D3FF03F0C7 -S315080014C803FA002008BD000038B50446FFF770FA8D +S315080014C87DFA002008BD000038B50446FFF770FA13 S315080014D80546B4F1FF3F02D0044B1B781C44FFF7BE S315080014E867FA401B8442FAD838BD00BF01000020BD S315080014F87047002800F0A18038B5044690F82030D7 @@ -402,7 +402,7 @@ S315080018E8012C06D9436A43F480234362012030BC9D S315080018F8704700296FD10468E46814F0030F64D0B0 S31508001908056801F11B0424012C5904F004049460A9 S31508001918002C6BD1056801F11B0424012C59640DB0 -S315080019281460056801F11B0424012D59C5F3400507 +S315080019281460056801F11B0424012D5905F0020508 S31508001938D560056825446D6805F00F0515610568C5 S3150800194825446D68C5F30725956105682C446468C0 S31508001958240C546104680A011444D4F8B8411C706C @@ -445,7 +445,7 @@ S31508001B9804D00F4A936943F0080393610B4BDB683B S31508001BA813F0400F04D00A4A936943F0040393617B S31508001BB8064BDB6813F0800F04D0054A936943F097 S31508001BC802039361F222014BDA607047003C024037 -S31508001BD8DC090020094B1B69002B01DB0020704734 +S31508001BD8100A0020094B1B69002B01DB00207047FF S31508001BE8064B074A5A6002F188325A601B69002B6D S31508001BF801DB002070470120704700BF003C024007 S31508001C0823016745034A136943F00043136100201B @@ -455,7 +455,7 @@ S31508001C380AD0B4F1FF3FF7D0CCB1FEF7B9FE401B86 S31508001C488442F1D2032038BD0C4BDB6813F0F20F3F S31508001C5809D10A4BDB6813F0010F0AD00122074B9A S31508001C68DA60002038BDFFF77BFF012038BD032066 -S31508001C7838BD002038BD00BFDC090020003C024002 +S31508001C7838BD002038BD00BF100A0020003C0240CD S31508001C882DE9F0411E4C247D012C03D1022420465F S31508001C98BDE8F081984617460E4605460122184BB8 S31508001CA81A754CF25030FFF7B7FF044698B9032D5A @@ -464,7 +464,7 @@ S31508001CC83DFF4CF25030FFF7A7FF04460D4A13694B S31508001CD823F0010313610022094B1A75D7E7B9B235 S31508001CE83046FFF717FFECE739463046FFF7FEFEA2 S31508001CF8E7E73A4643463046FFF7E0FEE1E700BF26 -S31508001D08DC090020003C0240084B1A6922F440729C +S31508001D08100A0020003C0240084B1A6922F4407267 S31508001D181A611A6942F004021A611A6942EA00202D S31508001D2840F480301861BFF34F8F7047003C02407B S31508001D3809B3012921D002291AD04FF44071104B52 @@ -480,13 +480,13 @@ S31508001DC81FD2217B2846FFF7B3FF4CF25030FFF7A6 S31508001DD823FF0F4A136923F07A031361024678B979 S31508001DE80135E9E7207BFFF78FFF4CF25030FFF704 S31508001DF813FF024606490B6923F004030B6100E04A -S31508001E0835600021014B1975104670BDDC090020A4 +S31508001E0835600021014B1975104670BD100A00206F S31508001E18003C02402DE9F04782B0D0F80080CA009D S31508001E28521A930003445A6D1B6D9A4255D8C146F7 S31508001E389B1AC1EBC104A2000244526C934200D813 S31508001E481A460C46074602F1030A4FEA9A0A15E0AB S31508001E5806F1030A4FEA9A0AE3001B1B9D003D4454 -S31508001E68A96C3B7C0093B3B2E2B2404601F05AFD36 +S31508001E68A96C3B7C0093B3B2E2B2404601F08CFD04 S31508001E78AB6C3344AB646B6D1E446E6509EB441357 S31508001E8803F510639B699BB29A4512D8E3001B1B9E S31508001E989A003A44516D136D99420AD24BB15B1AAE @@ -495,825 +495,840 @@ S31508001EB8CEE7E3001B1B980007443A6D7B6D9A42F0 S31508001EC80FD804F00F040123A340D8F8344824EAAD S31508001ED80304C8F83448002000E0012002B0BDE831 S31508001EE8F0870020FAE77047F0B58BB0002800F0B5 -S31508001EF88A80044690F8BD33F3B1032384F8BD33CA -S31508001F08206801F0C5FA254655F8107B6E460FCDB0 -S31508001F180FC60FCD0FC695E8030086E80300231DF4 -S31508001F280ECB384601F0FAF958B1022384F8BD33C6 -S31508001F38012528460BB0F0BD80F8BC33FFF7D3FF60 -S31508001F48DBE70021206801F0A9FA002315E0D9008B -S31508001F58C81A82002244012082F83D0082F83C30E3 -S31508001F68A2F84230002082F83F0050649064CA1AEA -S31508001F789100214408650133DBB26568AB42E6D3B4 -S31508001F88002315E0D800C11A8A002244002182F8E5 -S31508001F98FD1182F8FC3182F8FF11C2F80412C2F862 -S31508001FA80812C21A90002044C0F810120133DBB296 -S31508001FB89D42E7D8254655F8107B6E460FCD0FC6C5 -S31508001FC80FCD0FC695E8030086E80300231D0ECB40 -S31508001FD8384601F0A9FA054660B9002384F838306E -S31508001FE8012384F8BD33636A012B08D0206801F001 -S31508001FF850FE9EE7022384F8BD33012599E720465B -S3150800200800F01CFDF2E7012593E7704790F8BC330A -S31508002018012B01D10220704710B50446012380F828 -S31508002028BC33006801F029FE206801F02BFA00206D -S3150800203884F8BC0310BD38B590F8BC33012B02D11F -S315080020480225284638BD0446012380F8BC330068B3 -S3150800205801F01EFA206801F0DCFD054620B10023D0 -S3150800206884F8BC330125ECE7206801F012FE00234A -S3150800207884F8BC33E5E768B110B50446032380F84D -S31508002088BD33FFF7D8FF2046FFF7BFFF002084F8C7 -S31508002098BD0310BD0120704770B505460E46036896 -S315080020A8196C03EB461303F53064A3680269012A21 -S315080020B807D0364A914257D0F1B202F09BFD00206C -S315080020C870BD13F0080F14D0314A914205D913F49C -S315080020D8004F02D04FF40043A360284602F082FD61 -S315080020E805F571720121286801F030FE0823A360FE -S315080020F8E5E713F0200F30D113F0280FDFD1244A73 -S31508002108914202D913F4004F2AD1F200921B930088 -S315080021182B44D3F804222169C1F31201521AC3F8D1 -S315080021281422D3F80412D3F808220A44C3F808225A -S31508002138F1B2284602F05EFD002EC0D1C6EBC606EF -S31508002148B3002B44D3F81032002BB8D105F57172B9 -S315080021580121286801F0FAFDB1E72023A360AEE75C -S315080021684FF40043A360AAE713F4004F09D113F00C -S31508002178200F01D02023A360F1B2284602F03AFDC9 -S315080021889DE74FF40043A36099E700BF0A31544F0F -S315080021980A30544F38B5044603681D6C03EB4111E1 -S315080021A801F530618A680369012B0DD0124B9D42EF -S315080021B814D0204602F016FD104B9D4202D9236919 -S315080021C8012B12D0002038BD0C4B9D42F1D912F4D0 -S315080021D8004FEED04FF400438B60EAE712F4004F45 -S315080021E8E7D04FF400438B60E3E704F571720121E9 -S315080021F8206801F0ABFDE5E70A31544F0A30544F21 -S315080022082DE9F84F04460568284601F07EFD08B111 -S31508002218BDE8F88FA8460746206801F046FD00285D -S31508002228F6D0206801F041FD10F0020F04D02268AC -S31508002238536903F002035361206801F036FD10F470 -S31508002248002F40F092803E46206801F02EFD10F4DB -S31508002258802F40F0DC80206801F027FD0028C0F2B6 -S315080022684A81206801F021FD10F4006F0AD0D5F8DC -S31508002278083813F0010F40F058812268536903F4AF -S3150800228800635361206801F010FD10F0006F15D047 -S315080022982268536903F00063536194F8F433002BFA -S315080022A840F04781012184F8F41323685B6DC3F372 -S315080022B88303C4F8F833204600F0D4FB206801F0FD -S315080022C8F4FC10F4805F40F03881206801F0EDFCDA -S315080022D810F4005F40F08A81206801F0E6FC10F0EF -S315080022E8100F14D02268936923F0100393612F6A9C -S315080022F807F00F08C7F34343022B00F08F81062B1C -S3150800230800F0AD812268936943F010039361206851 -S3150800231801F0CBFC10F0080F40F0B581206801F0F9 -S31508002328C4FC10F4801F40F0B781206801F0BDFC9A -S3150800233810F4001F40F0BA81206801F0B6FC10F0CE -S31508002348804F40F0BD81206801F0AFFC10F0040F03 -S315080023583FF45EAF23685D6815F0040F40F0B98155 -S3150800236823685A6815435D6052E7206801F0A1FCA6 -S3150800237881463E4624E008EB46130122C3F8082B9B -S3150800238831462046FFF788FE29E031462046FFF702 -S3150800239801FF08EB46130822C3F8082B22E008EBCE -S315080023A846132022C3F8082B1AF4005F05D008EB59 -S315080023B846134FF40052C3F8082B01364FEA590959 -S315080023C8B9F1000F3FF440AF19F0010FF5D0F1B29B -S315080023D8206801F07EFC824610F0010FCBD11AF076 -S315080023E8080FD2D11AF0100F04D008EB46131022A2 -S315080023F8C3F8082B1AF0200FD6D02369012BCED1A3 -S3150800240804F571720121206801F0A0FCC7E720686D -S3150800241801F057FC81463E462EE0F200921B9300D7 -S315080024282344596C9A6C0A449A6448E01AF0080FCF -S3150800243804D008EB46130822C3F808291AF0100F27 -S3150800244804D008EB46131022C3F808291AF0400FDF -S3150800245804D008EB46134022C3F808291AF0020FDD -S3150800246804D008EB46130222C3F808291AF0800F8D -S315080024783CD101364FEA5909B9F1000F3FF4EBAEE2 -S3150800248819F0010FF5D05FFA86FB5946206801F066 -S3150800249829FC824610F0010FC8D006F00F03012167 -S315080024A801FA03F2D8F8343823EA0203C8F83438AC -S315080024B808EB4613C3F8081923698B42ADD0594669 -S315080024C8204602F0A3FB2369012BAFD1002EADD11C -S315080024D8C6EBC602930023441B6D002BA6D104F550 -S315080024E871720121206801F031FC9FE731462046C8 -S315080024F8FFF790FCBDE7D5F8043823F00103C5F8C3 -S31508002508043894F8F433012B08D0204602F0C4FBAB -S315080025182268536903F000435361A2E6002184F850 -S31508002528F413204600F09EFAF2E7204602F09AFBDA -S31508002538A3E6204602F096FBC0E605F50069D9F839 -S31508002548043023F00103C9F804301021206800F08C -S31508002558BDFF14E008EB47134FF67F31C3F8081997 -S31508002568D3F8002922F40012C3F80029C3F8081B77 -S31508002578D3F8002B22F40012C3F8002B013763683E -S315080025889F42E7D3D9F81C3043F00113C9F81C3029 -S31508002598236BEBB1D9F8843043F00B03C9F88430C0 -S315080025A8D9F8443043F00B03C9F84430D5F8003855 -S315080025B823F4FE63C5F8003804F57172217C206897 -S315080025C801F0C4FB2268536903F4805353617CE61F -S315080025D8D9F8142042F22B031343C9F81430D9F852 -S315080025E8103043F00B03C9F81030DFE7206801F014 -S315080025F891FB206801F072F8E060276800F034FA69 -S31508002608227B0146384600F0C7FE204602F010FB3A -S315080026182268536903F4005353615DE647F6F0737D -S315080026281F423FF46FAE4FEAC80AAAEB08034FEAFF -S315080026388309A1443F09C7F30A02D9F808122846AC -S3150800264801F078FAC7F30A07D9F808323B44C9F8FB -S315080026580832D9F814321F44C9F8147252E6082207 -S3150800266804F57171284601F065FAC7F30A174FEAA7 -S31508002678C803A3EB08018A002244D2F814321F447F -S31508002688C2F814723EE6204602F0CBFA226853696D -S3150800269803F00803536141E6F1B2204602F00BFB4A -S315080026A82268536903F4801353613EE6F1B2204663 -S315080026B802F0FBFA2268536903F4001353613BE6F8 -S315080026C8204602F0FEFA2268536903F080435361F4 -S315080026D839E6204602F0FFFA42E690F8BC33012BA9 -S315080026E801D10220704710B50446012380F8BC338F -S315080026F8006801F0C2FA002084F8BC0310BD90F8FF -S31508002708BC33012B01D10220704710B504460123BA -S3150800271880F8BC33006801F0BCFA002084F8BC03D2 -S3150800272810BD90F8BC33012B01D10220704710B5B3 -S315080027380446012380F8BC3380F83810006801F095 -S315080027488CFA002084F8BC0310BDF8B511F0800F88 -S315080027581ED101F00F06F500AF1BBC00274604F58D -S31508002768FC74044404343E460644002586F8FD51A4 -S3150800277801F00F012170A260E370627802B1E1806E -S31508002788022B14D090F8BC33012B13D10220F8BDC4 -S3150800279801F00F06F500AF1BBC0027463834044481 -S315080027A804343E460644012586F83D50E0E70023F2 -S315080027B82371E7E70546012380F8BC3321460068FC -S315080027C800F09CFF002085F8BC03F8BD38B511F069 -S315080027D8800F17D101F00F04E200151BAB001D4648 -S315080027E803F5FC73034404332C460444002284F896 -S315080027F8FD2101F00F01197090F8BC23012A10D1A8 -S31508002808022038BD01F00F04E200151BAB001D4677 -S315080028183833034404332C460444012284F83D2003 -S31508002828E7E70446012280F8BC231946006800F049 -S31508002838ADFF002084F8BC0338BD70B501F00F055C -S31508002848EE00711B8C0004F5FC740444211D761BEC -S31508002858B4000444C4F80822C4F810320023C4F8A3 -S31508002868143284F8FD3184F8FC510369012B06D02B -S3150800287865B1DAB2006801F069F8002070BDC5EBE9 -S31508002888C506B4000444C4F80C22F1E7DAB20068B5 -S3150800289800F0C4FFF1E701F00F01C1EBC1018B009D -S315080028A81844D0F81402704770B501F00F05EE0009 -S315080028B8711B8C0038340444211D761BB40004446B -S315080028C8A264236500236365012384F83D3084F8F0 -S315080028D83C500369012B06D05DB1DAB2006801F0F5 -S315080028E835F8002070BDC5EBC506B4000444E2649B -S315080028F8F2E7DAB2006800F091FFF2E738B501F0BE -S315080029080F0543689D4238D811F0800F15D1CA00C3 -S31508002918541AA3001C4603F5FC73034404332246E1 -S315080029280244002182F8FD1101229A701D7090F860 -S31508002938BC23012A0DD1022038BDEA00511B8B00A1 -S3150800294819463833034404330144012281F83D20EB -S31508002958EAE70446012280F8BC231946006801F014 -S31508002968FDF81DB1002084F8BC0338BD04F5717262 -S31508002978217C206801F0EAF9F4E7012038BD01F066 -S315080029880F03426893422FD810B511F0800F14D15F -S31508002998DA00D41AA1000C4601F5FC710144043189 -S315080029A80444002284F8FD2100228A700B7090F8EE -S315080029B8BC33012B0DD1022010BDDA00D41AA100B0 -S315080029C80C463831014404310444012284F83D2078 -S315080029D8EAE70446012380F8BC33006801F0EBF8FF -S315080029E8002084F8BC0310BD0120704730B4046881 -S315080029F8606A29B10D46A36A00EB134000230CE070 -S31508002A0840EA0240A06212E003F1400104EB8101AA -S31508002A18496800EB11400133DBB2691E8B42F3D3D8 -S31508002A2840EA024005F13F0104EB810148600020B5 -S31508002A3830BC70470368596200207047024603682D -S31508002A480121C0F8FC13002082F8F4039A6942F0C1 -S31508002A5800629A61596D024A0A435A65704700BF6F -S31508002A680300001070470000014B1868704700BF44 -S31508002A7808000020534B98421FD0534B984228D041 -S31508002A88524B984231D0524B98423AD0514B9842C1 -S31508002A9843D0514B98424CD0504B984255D0504B46 -S31508002AA898425ED04F4B984267D04F4B984270D0A9 -S31508002AB84E4B984279D00120704703F560531A693E -S31508002AC842F001021A611A6922F001021A6100200D -S31508002AD8704703F550531A6942F002021A611A69D7 -S31508002AE822F002021A610020704703F540531A695A -S31508002AF842F004021A611A6922F004021A610020D7 -S31508002B08704703F530531A6942F008021A611A69C0 -S31508002B1822F008021A610020704703F520531A6943 -S31508002B2842F010021A611A6922F010021A6100208E -S31508002B38704703F510531A6942F020021A611A6998 -S31508002B4822F020021A610020704703F500531A691B -S31508002B5842F040021A611A6922F040021A610020FE -S31508002B68704703F5E0531A6942F080021A611A6938 -S31508002B7822F080021A610020704703F5C0531A69CB -S31508002B8842F480721A611A6922F480721A61002066 -S31508002B98704703F5A0531A6942F400721A611A6954 -S31508002BA822F400721A610020704703F580531A69E7 -S31508002BB842F480621A611A6922F480621A61002056 -S31508002BC8704700BF000002400004024000080240A7 -S31508002BD8000C02400010024000140240001802408F -S31508002BE8001C02400020024000240240002802403F -S31508002BF8F0B40C6894FAA4F4B4FA84F42BE08E685A -S31508002C08826893FAA3F5B5FA85F56D0007FA05F50E -S31508002C1822EA050293FAA3F5B5FA85F56D0006FAD0 -S31508002C2805F52A43826037E04A69456A1B0A93FA1A -S31508002C38A3F6B6FA86F6B6000F2707FA06F625EAC1 -S31508002C48060593FAA3F3B3FA83F39B0002FA03F390 -S31508002C582B43436201340B6833FA04F250D001223D -S31508002C68A2401340F6D04E68026893FAA3F5B5FA5F -S31508002C7885F56D00032707FA05F522EA050293FA92 -S31508002C88A3F5B5FA85F56D0006FA05F52A43026037 -S31508002C984A68013A012AB2D90E69C26893FAA3F5B5 -S31508002CA8B5FA85F56D00032707FA05F522EA050240 -S31508002CB893FAA3F5B5FA85F56D0006FA05F52A43DC -S31508002CC8C2604A68022AC5D193FAA3F2B2FA82F216 -S31508002CD8072AA9D84D69026A93FAA3F6B6FA86F6B8 -S31508002CE8B6000F2707FA06F622EA060293FAA3F3AE -S31508002CF8B3FA83F39B0005FA03F313430362A9E7C0 -S31508002D084A68013A012A02D90020F0BC7047C96806 -S31508002D18426822EA030201FB03F313434360F3E71D -S31508002D281E4A136843F0010313601C4B1B6813F013 -S31508002D38020FFAD0194A00239360194B13601368D7 -S31508002D4823F0F80343F080031360144B1B6813F051 -S31508002D58007FFAD1114B1B6813F0006FFAD10F4B9D -S31508002D681B6813F0005FFAD10C4B0E4A5A60103AEA -S31508002D78C3F88420C3F88820DA6822F4FE42DA60A9 -S31508002D88DA6842F47F02DA605A6F22F001025A675B -S31508002D985A6F42F080725A6700207047003802401E -S31508002DA8FFFFF2EA10300024034B9B68C3F30313B2 -S31508002DB8024AD35CD840704700380240D850000809 -S31508002DC8034B9B68C3F38223024AD35CD8407047F7 -S31508002DD800380240E8500008034B9B68C3F34233A7 -S31508002DE8024AD35CD840704700380240E8500008C9 -S31508002DF80D4B5B6803F480030BB90C4800E00C48DC -S31508002E08094A536803F03F03B0FBF3F35068C0F36D -S31508002E18881000FB03F05368C3F3014301335B00D2 -S31508002E28B0FBF3F0704700BF003802400024F400F6 -S31508002E3800127A0008B5074B9B6803F00C03042BAD -S31508002E4806D0082B01D0044808BDFFF7D1FF08BDF6 -S31508002E58024808BD003802400024F40000127A002F -S31508002E6810B50446FFF7E6FF2060FFF79DFF606090 -S31508002E78FFF7A6FFA0606068FFF7AEFFE06010BD29 -S31508002E8808B5032809D00C2833D0B0F5406F5CD0B4 -S31508002E98302800F08780002008BD584BD3F89030BA -S31508002EA8034043EA0040564B98420FD0B0F1031F3F -S31508002EB815D0013B984206D0FFF7BCFFFFF774FF11 -S31508002EC8FFF78AFF08BDFFF7B5FF08BD4B4B1B6820 -S31508002ED813F0020F01D04B4808BD002008BD474B28 -S31508002EE81B6F13F0020F02D04FF4004008BD0020F4 -S31508002EF808BD424BD3F89030034043EA0040424BA2 -S31508002F0898420FD0B0F10C1F15D0043B984206D052 -S31508002F18FFF790FFFFF748FFFFF752FF08BDFFF7D7 -S31508002F2889FF08BD354B1B6813F0020F01D03548D9 -S31508002F3808BD002008BD314B1B6F13F0020F02D0E5 -S31508002F484FF4004008BD002008BD2C4BD3F890303C -S31508002F58034043EA00402D4B984210D0B0F10C2F9D -S31508002F6816D0A3F58063984206D0FFF763FFFFF7EC -S31508002F781BFFFFF731FF08BDFFF75CFF08BD1F4BB6 -S31508002F881B6813F0020F01D01E4808BD002008BDB3 -S31508002F981A4B1B6F13F0020F02D04FF4004008BDFE -S31508002FA8002008BD154BD3F89030034043EA00408B -S31508002FB8174B98420FD0B0F1301F15D0103B9842E6 -S31508002FC806D0FFF737FFFFF7EFFEFFF7F9FE08BD54 -S31508002FD8FFF730FF08BD094B1B6813F0020F01D035 -S31508002FE8084808BD002008BD044B1B6F13F0020FE4 -S31508002FF802D04FF4004008BD002008BD0038024042 -S31508003008020003000024F40008000C000008000C65 -S315080030182000300008B5C0280BD0B0F5407F34D062 -S31508003028B0F5405F5ED0B0F5404F00F088800020CC -S3150800303808BD594BD3F89030034043EA0040574B34 -S3150800304898420FD0B0F1C01F15D0403B984206D021 -S31508003058FFF7F0FEFFF7A8FEFFF7B2FE08BDFFF779 -S31508003068E9FE08BD4C4B1B6813F0020F01D04C480B -S3150800307808BD002008BD484B1B6F13F0020F02D08D -S315080030884FF4004008BD002008BD434BD3F89030E4 -S31508003098034043EA0040434B984210D0B0F1032F4F -S315080030A816D0A3F58073984206D0FFF7C3FEFFF73C -S315080030B87BFEFFF785FE08BDFFF7BCFE08BD364B4D -S315080030C81B6813F0020F01D0354808BD002008BD5B -S315080030D8314B1B6F13F0020F02D04FF4004008BDA6 -S315080030E8002008BD2C4BD3F89030034043EA004033 -S315080030F82D4B984210D0B0F1302F16D0A3F5805337 -S31508003108984206D0FFF796FEFFF74EFEFFF758FEE1 -S3150800311808BDFFF78FFE08BD1F4B1B6813F0020F8B -S3150800312801D01F4808BD002008BD1B4B1B6F13F0B4 -S31508003138020F02D04FF4004008BD002008BD164B08 -S31508003148D3F89030034043EA0040184B984210D011 -S31508003158B0F1C02F16D0A3F58043984206D0FFF7E2 -S3150800316869FEFFF721FEFFF72BFE08BDFFF762FE93 -S3150800317808BD094B1B6813F0020F01D0084808BDA3 -S31508003188002008BD044B1B6F13F0020F02D04FF442 -S31508003198004008BD002008BD003802408000C00075 -S315080031A80024F4000002000300200030008000C05C -S315080031B838B5036813F0010F46D00123002B77D1E1 -S315080031C80D46044603683D4A1A404B68C9680B43CE -S315080031D829690B43A9690B4313430360AB68426823 -S315080031E822F44052134343606B69826822F44072A2 -S315080031F813438360324B984228D0324B984229D0E1 -S31508003208314B98422AD0314B98422BD0304B9842B2 -S315080032182CD0304B98422ED02F4B984230D02F4B7B -S31508003228984232D00020002844D02B68002B43D07F -S31508003238AA69B2F5004F2DD000EB5300B0FBF3F0A6 -S3150800324880B2E060002038BD0023B7E70320FFF707 -S3150800325817FEE8E70C20FFF713FEE4E73020FFF730 -S315080032680FFEE0E7C020FFF7D5FEDCE74FF4407015 -S31508003278FFF7D0FED7E74FF44060FFF701FED2E725 -S315080032884FF44050FFF7C6FECDE74FF44040FFF72E -S31508003298C1FEC8E75A0802EB4000B0FBF3F04FF648 -S315080032A8F0730340C0F342001843E060002038BDBD -S315080032B8012038BD012038BD012038BDF369FFEF6C -S315080032C8001001400044004000480040004C0040FF -S315080032D8005000400014014000780040007C00407F -S315080032E8002301330C4A934211D80269002AF8DAF6 -S315080032F8036943F00103036100230133064A934235 -S3150800330807D8026912F0010FF7D100207047032089 -S3150800331870470320704700BF400D030084B010B5FE -S31508003328044603A880E80E00089B012B11D0E36821 -S3150800333843F04003E3602046FFF7D2FFA36B43F44C -S315080033488033A363069B012B1BD0BDE8104004B04D -S315080033587047A36B23F48033A363E2680D4B1340CD -S31508003368E360E36823F44013E3600F9B012B03D063 -S315080033782046FFF7B5FFE5E7E36843F48013E36003 -S31508003388F6E7A36843F00603A360A36843F020039F -S31508003398A360DAE7BFFFBDFF022A0AD00921C2687F -S315080033A822F47052C260C36843EA8123C3600020CE -S315080033B87047274B0B44274A934239D9264B0B4467 -S315080033C8264A934236D9264B0B44264A934233D982 -S315080033D8254B0B4402F5C332A03293422ED9234B10 -S315080033E80B44234A93422BD9224B0B4402F59222CB -S315080033F802F57872934225D91F4B0B4402F5C3226E -S3150800340802F5207293421FD91C4B0B4402F5B712DA -S3150800341802F55872934219D9194B0B4402F5122230 -S3150800342802F5F862934201D90621B8E70721B6E7FB -S315080034380F21B4E70E21B2E70D21B0E70C21AEE75C -S315080034480B21ACE70A21AAE70921A8E70821A6E77C -S31508003458405327FFFF340C00401E1BFF3F420F0056 -S3150800346800DC0BFF7F4F1200808CF9FE60B6E5FE84 -S315080034785FE3160000D3CEFEC05BB3FE00CA91FE1A -S31508003488E05459FE836843F00103836000207047BF -S31508003498836823F0010383600020704708B5C36872 -S315080034A823F0C043C360012909D069B9C36843F04A -S315080034B88043C3603220FEF707F8002008BDC368BA -S315080034C843F00053C360F5E7012008BD890141F0C0 -S315080034D82001016100230133054A934205D8026990 -S315080034E812F0200FF7D1002070470320704700BF5D -S315080034F8400D03001023036100230133054A934254 -S3150800350805D8026912F0100FF7D10020704703207A -S31508003518704700BF400D0300D0F800381943C0F8BB -S31508003528001800207047000084B02DE9F0410446D1 -S3150800353807A880E80E002546002306E003F14002A6 -S3150800354804EB82020021516001330E2BF6D9119B38 -S3150800355883BBA36B23F40013A363236843F04003D8 -S315080035682360236843F0800323600023C4F8003EE1 -S3150800357804F50066D4F80038C4F800380C9B012B0B -S315080035881DD0032B27D003212046FFF7C5FF10219E -S315080035982046FFF79BFF804608B14FF001082046F2 -S315080035A8FFF7A8FF08B14FF00108002333617361DC -S315080035B8F36127E0A36B43F40013A363D5E7099BDC -S315080035C823B900212046FFF7A7FFE0E70121204697 -S315080035D8FFF7A2FFDBE7099B23B900212046FFF77F -S315080035E89BFFD4E701212046FFF796FFCFE7C3B92B -S315080035F84FF00060C2F8000900220A614FF67F32D0 -S315080036088A60013307998B4210D205EB431202F5FB -S315080036181061D2F800090028E9DB0020C2F8000981 -S31508003628EAE74FF09040C2F80009E5E700230AE008 -S31508003638BBB14FF09047C2F8007B002202614FF6F3 -S315080036487F32826001338B4210D205EB431202F5B2 -S315080036583060D2F8007B002FEADB0027C2F8007B2F -S31508003668EBE74FF00067C2F8007BE6E7336923F417 -S31508003678807333610A9B012B1BD00022A2616FF06D -S31508003688804262611BB9A36943F01003A361A2696A -S315080036980E4B1343A3610D9B1BB1A36943F00803A3 -S315080036A8A361119B012B0BD04046BDE8F04104B03D -S315080036B87047074A3263316B064A0A433263DCE7C6 -S315080036C8A269054B1343A361EEE700BF00383C80A7 -S315080036D8000180000300010004000040D0F8083803 -S315080036E813F0060305D0062B18BF022B03D10220B8 -S315080036F870470020704700207047000070B40B78A8 -S315080037084A78012A20D0D0F81C2803F00F0601248D -S31508003718B44042EA0442C0F81C2800EB4310D0F82B -S31508003728003B13F4004F0CD1D0F8002B8B68C3F379 -S315080037380A03C97843EA81431343134A1A43C0F86C -S31508003748002B002070BC7047D0F81C4803F00F0601 -S31508003758B24092B22243C0F81C2800EB4310D0F8B6 -S31508003768002912F4004FECD1D0F800498A68C2F350 -S315080037780A02C97842EA814242EA83532343024A43 -S315080037881A43C0F80029DCE70080001070B40C78EA -S315080037984B78012B1FD0D0F83C5804F00F060122AD -S315080037A802FA06F625EA0645C0F83C58D0F81C5829 -S315080037B8097801F00F018A4025EA0242C0F81C2858 -S315080037C800EB4410D0F8002B124B1340C0F8003B0E -S315080037D8002070BC7047D0F83C6804F00F0203FA62 -S315080037E802F292B226EA0202C0F83C28D0F81C284F -S315080037F8097801F00F018B409BB222EA0303C0F84F -S315080038081C3800EB4410D0F80029034B1340C0F8C5 -S315080038180039DDE70078F3EF007833EC70B40B78FD -S315080038284C78012C24D000EB431000F530631D6951 -S315080038383A4C2C401C611D69394C2C401C614C695A -S315080038480CB18C684C611C6944F400241C611C6921 -S315080038588D68C5F312052C431C61012A59D0D0F886 -S31508003868003B43F00443C0F8003B002070BC704797 -S315080038784C6954BB00EB4314D4F81069284D3540FD -S31508003888C4F81059D4F8105945F40025C4F8105945 -S31508003898D4F81069214D3540C4F81059012A30D09A -S315080038A84A694AB1D0F83428097801F00F04012189 -S315080038B8A1400A43C0F8342800EB4310D0F8002981 -S315080038C842F00442C0F80029CFE700EB431404F598 -S315080038D810642669114D354025612669104D354015 -S315080038E825614E698D68AE4200D94D61256945F452 -S315080038F80025256125694E69C6F3120635432561F3 -S31508003908CCE70A69002AD7D000EB4311C1F8142975 -S31508003918D2E7CA68002AA2D05A61A0E70000F8FFD1 -S31508003928FFFF07E070B49DF80C4064B903339E089E -S3150800393807E000EB023303F5805351F8045B1D607A -S315080039480134B442F5D3002070BC7047F0B583B093 -S315080039580C784B78012B29D000EB441404F5306316 -S315080039681E69714D35401D611E69704D35401D61D2 -S315080039784D69002D40F0AA801D698E68C6F31206A7 -S3150800398835431D611D6945F400251D61012A00F0AE -S31508003998B280CB78012B00F0B480D4F8003B43F012 -S315080039A80443C4F8003B002003B0F0BD4B69002B64 -S315080039B83BD100EB4413D3F810695C4D3540C3F886 -S315080039C81059D3F8105945F40025C3F81059D3F8F7 -S315080039D81069554D3540C3F81059012A57D0CB7888 -S315080039E8012B0BD04B694BB1D0F834380D7805F05C -S315080039F80F060125B5402B43C0F83438CB78012B80 -S31508003A084DD000EB4414D4F8003943F00443C4F805 -S31508003A180039CB78012BC6D114460B46C9681A78E3 -S31508003A289B8A0094FFF77EFFBDE700EB4413D3F8A3 -S31508003A3810693D4D3540C3F81059D3F810693B4D08 -S31508003A483540C3F81059D3F810694D698F683D4455 -S31508003A58013DB5FBF7F5364F07EAC5453543C3F8C3 -S31508003A681059D3F810594E69C6F312063543C3F8E8 -S31508003A78105903F51063CD78012DAED11D6925F0CF -S31508003A88C0451D611D6945F000551D61A5E70B690F -S31508003A98002BB3D000EB4415C5F81439AEE7D0F8B7 -S31508003AA8083813F4807F08D100EB4415D5F8003997 -S31508003AB843F00053C5F80039A3E700EB4415D5F8D9 -S31508003AC8003943F08053C5F800399AE78E683544BB -S31508003AD8013DB5FBF6F51E69154F07EAC5473E438E -S31508003AE81E611F698E68ADB206FB05F5C5F312059A -S31508003AF83D431D614AE7CA68002A3FF44AAF5A613E -S31508003B0847E7D0F8083813F4807F06D1D4F8003B85 -S31508003B1843F00053C4F8003B3FE7D4F8003B43F0B2 -S31508003B288053C4F8003B38E70000F8FFFFFF07E0BA -S31508003B380000F81F03329208002393420CD210B4EF -S31508003B4800F58054246841F8044B01339342F7D3AF -S31508003B5808465DF8044B7047084670470B784A785C -S31508003B68012A14D000EB4310D0F8002B002A06DBF4 -S31508003B782BB1D0F8003B23F08043C0F8003BD0F8BF -S31508003B88003B43F40013C0F8003B0020704700EBE5 -S31508003B984310D0F80029002A06DB2BB1D0F80039E3 -S31508003BA823F08043C0F80039D0F8003943F40013ED -S31508003BB8C0F80039E9E70B784A78012A0ED000EBF5 -S31508003BC84310D0F8003B23F40013C0F8003BCB7829 -S31508003BD8023BDBB2012B15D90020704700EB4310D6 -S31508003BE8D0F8003923F40013C0F80039CB78023B23 -S31508003BF8DBB2012BF0D8D0F8003943F08053C0F86F -S31508003C080039E9E7D0F8003B43F08053C0F8003B99 -S31508003C18E2E738B505460446002208E004EB4213F5 -S31508003C284FF67F31C3F80819C3F8081B01320E2A64 -S31508003C38F4D90022C5F81028C5F81428C5F81C2890 -S31508003C482846FFF757FC034608B1184638BD102121 -S31508003C582846FFF73BFC0346F7E7D0F8003823F475 -S31508003C68FE63C0F80038D0F80038090101F4FE618F -S31508003C780B43C0F800380020704708B5D0F8043858 -S31508003C8823F00203C0F804380320FDF71DFC0020C2 -S31508003C9808BD08B5D0F8043843F00203C0F804385C -S31508003CA80320FDF711FC002008BD42698069104011 -S31508003CB87047D0F8183800F50060C0691840000C3D -S31508003CC87047D0F8183800F50060C069184080B207 -S31508003CD8704700EB4111D1F8082B00F500604069E0 -S31508003CE81040704710B4D0F81028D0F8343801F0CE -S31508003CF80F04E340DB01DBB2134300EB4111D1F8B3 -S31508003D08080918405DF8044B7047406900F001003F -S31508003D1870470000D0F800290B4B1340C0F800394B -S31508003D2800F500639A6802F00602042A05D05A6864 -S31508003D3842F480725A6000207047D0F8002942F091 -S31508003D480302C0F80029F2E700F8FFFF10B4046C74 -S31508003D58154B9C4203D9D0F8003B002B16DB0024F0 -S31508003D68C0F8104BD0F8104B44F40024C0F8104B98 -S31508003D78D0F8104B44F01804C0F8104BD0F8104B84 -S31508003D8844F0C044C0F8104B012903D000205DF860 -S31508003D98044B7047C0F8142BD0F8003B43F0802337 -S31508003DA8C0F8003BF2E700BF0A30544F014B1860D1 -S31508003DB8704700BF0800002098B108B50346D0F838 -S31508003DC88C0210B10020C3F88C0209B1C3F8881216 -S31508003DD81846012380F87432027000F087FF002025 -S31508003DE808BD0220704710B50446012380F87432CE -S31508003DF8D0F88C325B6801799847204600F0E6FFD0 -S31508003E08204600F0D3FF002010BD19B1C0F88C1267 -S31508003E18002070470220704708B500F0CFFF002041 -S31508003E2808BD08B5D0F88C3223B11B68984718B175 -S31508003E38022008BD022008BD002008BD08B5D0F834 -S31508003E488C325B689847002008BD38B5044600F5EB -S31508003E582075284600F049F90123C4F86C32B4F8ED -S31508003E688632C4F8703294F8801201F01F03012BC9 -S31508003E780ED03BB1022B10D001F08001204600F08D -S31508003E88C0FF03E02946204600F0B9FA002038BDED -S31508003E982946204600F0E7FAF8E72946204600F0C2 -S31508003EA812FBF3E738B50446A9BB1046D4F86C32BA -S31508003EB8032B03D0052B25D0002038BDD4F84C3168 -S31508003EC8D4F8502193420DD99B1AC4F84C319A421A -S31508003ED806D99AB20146204600F030FC002038BDC3 -S31508003EE892B2F7E7D4F88C321B691BB194F874229E -S31508003EF8032A04D0204600F029FC002038BD2046B5 -S31508003F089847F7E70025C4F86C522946204600F07A -S31508003F1878FF284638BD0A46D0F88C329B694BB1DB -S31508003F2890F87412032901D0022038BD1146984723 -S31508003F38002038BD022038BD10B50446002956D1E0 -S31508003F481046D4F86C32022B09D0002B18BF042B64 -S31508003F5844D094F87832012B45D0002010BD236A46 -S31508003F68626A93421BD8E169B1FBF2F302FB1313A9 -S31508003F782BB98A4203D8D4F8703299421DD3D4F89B -S31508003F888C32DB681BB194F87422032A23D080216B -S31508003F98204600F036FF204600F0E3FBD9E79A1AD8 -S31508003FA8226292B20146204600F0C0FB00231A4658 -S31508003FB81946204600F045FFCBE700221146204661 -S31508003FC800F0B4FB0021C4F870120B460A462046D6 -S31508003FD800F037FFBDE720469847D8E780212046F6 -S31508003FE800F00FFFB5E7002084F8780210BD0A46EE -S31508003FF8D0F88C325B694BB190F87412032901D05A -S31508004008022010BD11469847002010BD022010BD99 -S3150800401870B5044640230022114600F0DFFE01254C -S31508004028C4F844514026C4F850613346002280211A -S31508004038204600F0D3FEA561666284F87452002310 -S31508004048C4F86C326360C4F87C32D4F890322BB169 -S31508004058D4F88C325B68002120469847002070BD4A -S3150800406801740020704790F8743280F8753204237A -S3150800407880F874320020704790F8753280F87432E8 -S315080040880020704708B590F87432032B01D0002039 -S3150800409808BDD0F88C32DB69002BF8D09847F6E7CC -S315080040A800207047002070470020704708B5012295 -S315080040B880F87422D0F88C2252680179904700203B -S315080040C808BD002302E00133DBB201300278002A7A -S315080040D8F9D11846704708B54B88012B00D008BD9A -S315080040E8C0F87C3200F032FBF9E70B7803704B789E -S315080040F843708B78CA7803EB022343800B794A7995 -S3150800410803EB022383808B79CA7903EB0223C380E6 -S31508004118704710B50446802100F073FE002120463A -S3150800412800F06FFE10BD30B583B005460C464A88C8 -S31508004138130A013B062B00F28480DFE803F0041615 -S315080041482A8282667300D0F888321B680DF1060148 -S31508004158007C9847BDF8062012B1E388002B74D175 -S31508004168E388002B7BD003B030BD037C43B9D0F875 -S315080041788C329B6A0DF10600984702234370E9E7DB -S31508004188D0F88C32DB6A0DF1060098470223437093 -S31508004198E0E7D2B2052A34D8DFE802F0030B131B8E -S315080041A8232BD0F888325B680DF10601007C984706 -S315080041B8D0E7D0F888329B680DF10601007C98474D -S315080041C8C8E7D0F88832DB680DF10601007C984705 -S315080041D8C0E7D0F888321B690DF10601007C9847BC -S315080041E8B8E7D0F888325B690DF10601007C984774 -S315080041F8B0E7D0F888329B690DF10601007C98472C -S31508004208A8E72146FFF785FFADE7037C33B9D0F861 -S315080042188C325B6B0DF1060098479BE72146FFF742 -S3150800422878FFA0E7037C43B9D0F88C321B6B0DF1F5 -S3150800423806009847072343708CE72146FFF769FF6E -S3150800424891E72146FFF765FF8DE79A4228BF1A4688 -S31508004258ADF806200146284600F05BFA80E72846AE -S3150800426800F074FA7FE738B504468B88F3B9CB882B -S31508004278E3B94B887F2B19D803F07F0590F8743279 -S31508004288032B0CD080F87652294600F0CAFD204642 -S3150800429800F05CFA35B1022384F8743238BDFFF7AA -S315080042A838FF38BD012384F8743238BD2046FFF735 -S315080042B830FF38BD38B504460D468978284B19703D -S315080042C801290ED890F87432022B0ED0032B21D070 -S315080042D82946FFF71EFF224B19782046FFF7AEFD41 -S315080042E838BD2946FFF715FF38BD81B1416003235C -S315080042F880F87432FFF795FD022803D0204600F0AF -S3150800430825FA38BD29462046FFF703FF38BD00F0D1 -S315080043181DFA38BD89B1436899421DD0D9B2FFF74D -S315080043288DFD0F4B197861602046FFF77AFD022844 -S315080043380DD0204600F00AFA38BD022380F87432F8 -S315080043484160FFF77BFD204600F000FA38BD294694 -S315080043582046FFF7DEFE38BD00F0F8F938BD00BF85 -S31508004368D409002008B5CB88012B0BD190F87432F4 -S315080043789BB1022B09D9032B0FD10122011D00F08D -S31508004388C8F908BDFFF7C5FE08BD0146002341F870 -S31508004398083F012200F0BDF908BDFFF7BAFE08BDBF -S315080043A808B590F87432013B022B12D8CB88022B39 -S315080043B80CD10123C360D0F87C320BB10323C36048 -S315080043C8022200F10C0100F0A4F908BDFFF7A1FECE -S315080043D808BDFFF79EFE08BD08B590F87432013B84 -S315080043E8022B09D84B88012B00D008BD0023C0F83A -S315080043F87C3200F0ABF908BDFFF78BFEF5E708B588 -S315080044080B7803F06003202B05D0402B03D043B16B -S31508004418FFF77FFE03E0D0F88C329B6898470020A8 -S3150800442808BD4B78092B1BD8DFE803F011171A14B7 -S315080044381A08051A0E0BFFF776FEF0E7FFF713FFC3 -S31508004448EDE7FFF737FFEAE7FFF78CFFE7E7FFF740 -S31508004458A7FFE4E7FFF73FFEE1E7FFF7BDFFDEE763 -S31508004468FFF757FEDBE738B505460C460B7803F029 -S315080044786003202B05D0402B03D013B1FFF749FE64 -S315080044880BE095F87432013B022B17D82379012BD8 -S3150800449805D921462846FFF73CFE002038BDD5F841 -S315080044A88C329B68214628469847E388002BF4D126 -S315080044B80028F2D1284600F049F9EEE721462846B1 -S315080044C8FFF727FEE9E738B504468A880B7803F02C -S315080044D86003202B08D0D0B2402B05D05BB120460C -S315080044E8FFF717FE002038BDD4F88C329B682046A3 -S315080044F89847002038BD202B12D04B78012B3AD08C -S31508004508002B67D0032B40F0E18094F87432022B15 -S315080045180CD0032B1DD02046FFF7FBFD002038BD25 -S31508004528D4F88C329B682046984738BD002818BFAF -S31508004538802809D00146204600F063FC80212046E1 -S3150800454800F05FFC002038BD2046FFF7E2FD00209A -S3150800455838BD4B882BB9002818BF802801D0CB88CE -S3150800456823B1204600F0F2F8002038BD014620465F -S3150800457800F047FCF5E794F87432022B06D0032BB3 -S3150800458817D02046FFF7C5FD002038BD002818BFFC -S31508004598802809D00146204600F033FC80212046B1 -S315080045A800F02FFC002038BD2046FFF7B2FD00209A -S315080045B838BD4B88002B40F08E8010F07F0F04D151 -S315080045C8204600F0C3F8002038BD0146204600F012 -S315080045D820FCF5E794F87432022B06D0032B2AD070 -S315080045E82046FFF796FD002038BD002818BF80280A -S315080045F812D112F0800F14D100F07F0000EB800072 -S31508004608830003F5A073E11800250D6002222046F1 -S3150800461800F07FF8284638BD2046FFF77AFD0020C7 -S3150800462838BD00F07F0000EB8000830003F110011D -S3150800463821440431E8E752B2002A1FDB00F00F03D1 -S3150800464803EB83039D002544D5F8443123B3002A98 -S3150800465827DB00F07F0202EB8202930003F5A073C2 -S31508004668E518802818BF002825D100232B600222C8 -S315080046782946204600F04DF8002038BD00F00F0303 -S3150800468803EB83039D002544AB69002BDFD1204645 -S31508004698FFF73FFD002038BD2046FFF73AFD00200A -S315080046A838BD00F07F0202EB8202930003F1100581 -S315080046B825440435D5E70146204600F051FB10B1DC -S315080046C801232B60D3E700232B60D0E72046FFF7AA -S315080046D820FD002038BD002038BDC8B170B50D468C -S315080046E816460446FFF7EDFC013040003080287076 -S315080046F803236B70022307E05A1CD2B20134E9542B -S315080047080233DBB20021A95421780029F4D170BDFF -S31508004718704710B513460222C0F86C22C3610362BB -S315080047280A46002100F085FB002010BD08B513468F -S315080047380A46002100F07DFB002008BD08B513468F -S315080047480A46002100F07DFB002008BD08B50423B1 -S31508004758C0F86C3200231A46194600F06AFB002096 -S3150800476808BD08B50523C0F86C3200231A46194651 -S3150800477800F067FB002008BD10B40F4AD2F888304D -S3150800478843F47003C2F888300C4B196841F00101EC -S315080047981960002098601C68094921401960094970 -S315080047A85960196821F480211960D8604FF00063B0 -S315080047B893605DF8044B704700ED00E0003802404E -S315080047C8FFFFF6FE1030002408B52F4A136823F0B9 -S315080047D80F0343F007031360136803F00F03072B4F -S315080047E803D06A212948FCF7CDFA294B1A6842F4FE -S315080047F840421A601A6842F480321A6003F5E433B4 -S315080048081A6842F480221A601A6842F480321A60DA -S31508004818204B1B6813F4003FFAD01E4B5A681E49F2 -S3150800482811401E4A0A435A605A681D4911401D4AD2 -S315080048380A435A601A6842F080721A60154B1B6858 -S3150800484813F0007FFAD0134B9A6822F0F0029A60A8 -S315080048589A6822F4E05242F4A0529A609A6822F4BE -S31508004868604242F400429A609A6822F0030242F0D3 -S3150800487802029A60074B9B6803F00C03082BF9D1D0 -S315080048880948FFF793FA08BD003C0240F0500008B3 -S3150800489800700040003802400080BCFF086C4000E9 -S315080048A80080BFF0086C400900E6DF0C08B5FCF785 -S315080048B8FFFDFFF789FF08BD08B5FFF7F7FFFCF707 -S315080048C8AFFAFCF7BBFAFCE72DE9F04391B04C4C7C -S315080048D8636C43F480436364636C03F4804309930D -S315080048E8099B236C43F080532364236C03F080539D -S315080048F80893089B236B43F001032363236B03F098 -S3150800490801030793079B236B43F002032363236B77 -S3150800491803F002030693069B236B43F00403236301 -S31508004928236B03F004030593059B236B43F00803E5 -S315080049382363236B03F008030493049B236C43F453 -S3150800494880232364236C03F480230393039B236C3B -S3150800495843F000732364236C03F000730293029BED -S3150800496880230A9301230B9300250C950D950E9524 -S31508004978DFF89C800AA94046FEF73AF94FF4000387 -S31508004988C8F818304FF400530A930B950E950AA9E0 -S315080049981C48FEF72DF94FF44079CDF828900227E0 -S315080049A80B9703260C960D950E9507230F930AA9C0 -S315080049B81548FEF71DF9CDF828900B970C960D9516 -S315080049C80E9509230F930AA94046FEF711F94FF4E5 -S315080049D8C0530A930B970C960D950E950A230F93B9 -S315080049E80AA90A48FEF704F9636B43F08003636370 -S315080049F8636B03F080030193019B11B0BDE8F08354 -S31508004A080038024000080240000C0240000002403C -S31508004A180004024010B5FEF783F91B4C4FF4000357 -S31508004A28A3611A48FEF726F81948FEF723F8204620 -S31508004A38FEF720F81748FEF71DF8174B5A6B22F0B1 -S31508004A4880025A631A6C22F000721A641A6C22F4ED -S31508004A5880221A641A6B22F008021A631A6B22F06B -S31508004A6804021A631A6B22F002021A631A6B22F0FE -S31508004A7801021A631A6C22F080521A645A6C22F4DC -S31508004A8880425A6410BD00BF00040240000C024070 -S31508004A98000802400000024000380240DFF834D01F -S31508004AA8002103E00C4B5B58435004310B480C4B70 -S31508004AB842189A42F6D30B4A02E0002342F8043B0E -S31508004AC8094B9A42F9D3FFF757FE00F053FAFFF756 -S31508004AD8F3FE704700000520585100080000002022 -S31508004AE8C0000020C00000203C100020FEE700009F -S31508004AF82023038000487047440000200A230380C7 -S31508004B08004870476400002008B590F87432032BF3 -S31508004B1801D0002008BDFCF7D5F8FAE708B5FCF778 -S31508004B28D1F8002008BD08B50846FCF7FFF80020AC -S31508004B3808BD000008B50B7813F0600F06D14B784E -S31508004B480A2B14D00B2B17D0062B01D0002008BD32 -S31508004B584B881B0A212B04D00B491722FFF7D9FDCE -S31508004B68F4E7CA88172A28BF17220849F6E7012250 -S31508004B780749FFF7CEFDE9E78B7813B9044A1360AE -S31508004B88E4E7FFF7C6FAE1E74D00002056000020E3 -S31508004B98D809002010B50446812100F02AF9012118 -S31508004BA8204600F026F9002010BD000010B504467E -S31508004BB840230222812100F011F940230222012113 -S31508004BC8204600F00BF94023034A0121204600F04D -S31508004BD838F9002010BD00BFF809002000487047C2 -S31508004BE8F809002008B500F57171D0F80004FFF738 -S31508004BF82CF908BD08B5C1EBC10293000344D3F8E4 -S31508004C080822D0F80004FFF74DF908BD08B5C1EB2E -S31508004C18C102930003449A6CD0F80004FFF78CF994 -S31508004C2808BD08B5D0F80004FFF72CFA08BD00003F -S31508004C3810B50446C3683BB1022B0FD0912108482A -S31508004C48FCF7A0F8012100E00021D4F80004FFF7DA -S31508004C5807FAD4F80004FFF7DBF910BD0121F4E7D9 -S31508004C68FC50000810B50446D0F80004FFF7FBF915 -S31508004C782268D2F8003E43F00103C2F8003E236AD0 -S31508004C8823B1044A136943F006031361FCF79CFB36 -S31508004C9810BD00BF00ED00E010B50446FCF795FB13 -S31508004CA8D4F80004FFF7E8F910BD08B5D0F80004F1 -S31508004CB8FFF7F8F908BD08B5D0F80004FFF7F0F9CA -S31508004CC808BD10B504460120FCF77DFBD4F800049E -S31508004CD8FFF7EAF910BD10B504460020FCF773FB88 -S31508004CE8D4F80004FFF7E2F910BD000003780BB109 -S31508004CF80020704710B503461748C0F80034C3F8B3 -S31508004D0898024FF0A0430360062343600222C2605C -S31508004D180023036182610122C26103624362C3629E -S31508004D280363FDF7E1F880B90B4C80212046FDF7AF -S31508004D3881FE402200212046FDF758FE80220121E7 -S31508004D482046FDF753FE002010BD40F22511034802 -S31508004D58FCF718F8E8E700BF380A0020FC500008F6 -S31508004D68D0F8983211F0800F08D101F07F01C1EB15 -S31508004D78C1018A00134493F8FE01704701F07F01C8 -S31508004D88C1EBC1018A00134493F83E00704708B581 -S31508004D98D0F89802FDF77FFD08BD18B1022803D0A0 -S31508004DA802207047002070470120704708B5D0F8E0 -S31508004DB89802FDF760F9FFF7F0FF08BD08B5D0F8C7 -S31508004DC89802FDF723F9FFF7E8FF08BD08B5D0F8FC -S31508004DD89802FDF730F9FFF7E0FF08BD10B51C4645 -S31508004DE813462246D0F89802FDF7AFFCFFF7D5FF21 -S31508004DF810BD08B5D0F89802FDF7E8FCFFF7CDFF17 -S31508004E0808BD08B5D0F89802FDF778FDFFF7C5FF85 -S31508004E1808BD08B5D0F89802FDF7B1FDFFF7BDFF44 -S31508004E2808BD08B5D0F89802FDF77BFCFFF7B5FF73 -S31508004E3808BD08B5D0F89802FDF736FDFFF7ADFFAF -S31508004E4808BD08B5D0F89802FDF7F7FCFFF7A5FFE7 -S31508004E5808BD000012230B80004870478C0000200C -S31508004E6804230B8000487047A000002000239342C3 -S31508004E7816D230B40BE0373401F8134000015C0051 -S31508004E88013400250D550133DBB2934206D2040FCF -S31508004E98092CF0D8303401F81340EFE730BC7047D6 -S31508004EA87047000038B50A4B186804331C68043381 -S31508004EB81B68C01800D138BD064D0822A91CFFF783 -S31508004EC8D5FF042205F112012046FFF7CFFFF2E7C6 -S31508004ED820F4F01FA400002008B51A230B80FFF75A -S31508004EE8E1FF014808BD00BFA400002008B50A462E -S31508004EF828B105490548FFF7F0FB034808BD0249EC -S31508004F080248FFF7EAFBF8E73C0E00203C51000888 -S31508004F1810B5044C0A4621460348FFF7DEFB20462F -S31508004F2810BD00BF3C0E00202C51000808B50A46E3 -S31508004F3828B105490548FFF7D0FB034808BD0249CB -S31508004F480248FFF7CAFBF8E73C0E00200C51000898 -S31508004F5808B50A4628B105490548FFF7BEFB0348C0 -S31508004F6808BD02490248FFF7B8FBF8E73C0E0020DF -S31508004F781451000870B50D4E0D4CA41BA41000253D -S31508004F88A54209D10B4E0C4C00F018F8A41BA41026 -S31508004F980025A54205D170BD56F825309847013534 -S31508004FA8EEE756F8253098470135F2E750510008DC -S31508004FB8505100085051000854510008F8B500BF70 -S31508004FC8F8BC08BC9E467047F8B500BFF8BC08BCD4 -S30908004FD89E4670472C -S31508004FDC2E2E5C2E2E5C2E2E5C2E2E5C536F75722E -S31508004FEC63655C41524D434D375F53544D333246DE -S31508004FFC375C63616E2E630005020602060307031F -S3150800500C0803090309040A040B040C040C050D0512 -S3150800501C0E050F050F06100610071008008000086D -S3150800502C008000000100000000000108008000005C -S3150800503C0200000000800108008000000300000048 -S3150800504C000002080000020004000000000004082A -S3150800505C0000040005000000000008080000040019 -S3150800506C0600000000000C08000004000700000001 -S3150800507C2E2E5C2E2E5C2E2E5C2E2E5C536F75728D -S3150800508C63655C41524D434D375F53544D3332463D -S3150800509C375C72733233322E630000002E2E5C2E70 -S315080050AC2E5C2E2E5C2E2E5C536F757263655C41DE -S315080050BC524D434D375F53544D333246375C7573F7 -S315080050CC622E63004F70656E424C5400000000005F -S315080050DC000000000102030406070809000000008E -S315080050EC010203042E2E5C6D61696E2E63000000AE -S315080050FC2E2E5C757362645F636F6E662E6300009A -S3150800510C44656661756C740057696E555342204246 -S3150800511C756C6B20496E7465726661636500000078 -S3150800512C4F70656E424C5420557365720000000032 -S3150800513C57696E5553422042756C6B2044657669E7 -S3090800514C6365000089 -S30908005150ED01000857 -S30908005154C901000877 -S3150800515804010000100000000024F400B54B000804 -S315080051689D4B00083D4B00080000000000000000A9 -S31508005178254B00082F4B0008114B000800000000BB -S315080051880000000000000000F94A000800000000BE -S31508005198054B000809022000010100C03209040075 -S315080051A80002FF000000070581024000FF0705010D -S315080051B8024000FF0A060002000000400100000045 -S315080051C85D4E0008694E0008194F0008F54E00089C -S315080051D8E14E0008354F0008594F00081201000231 -S315080051E800000040501DAC600002010203010000E7 -S315080051F8040309041A030000000000000000000068 -S315080052080000000000000000000000000000000088 -S70508004AA503 +S31508001EF891800446056890F8BD3323B3032384F814 +S31508001F08BD33EB6B13F4807F01D10023236120686E +S31508001F1801F0C8FA254655F8107B6E460FCD0FC650 +S31508001F280FCD0FC695E8030086E80300231D0ECBE0 +S31508001F38384601F0FDF958B1022384F8BD33012566 +S31508001F4828460BB0F0BD80F8BC33FFF7CCFFD5E7C1 +S31508001F580021206801F0ACFA002315E0D900C81A58 +S31508001F6882002244012082F83D0082F83C30A2F81B +S31508001F784230002082F83F0050649064CA1A9100E3 +S31508001F88214408650133DBB26568AB42E6D3002312 +S31508001F9815E0D800C11A8A002244002182F8FD11EA +S31508001FA882F8FC3182F8FF11C2F80412C2F8081246 +S31508001FB8C21A90002044C0F810120133DBB29D42C1 +S31508001FC8E7D8254655F8107B6E460FCD0FC60FCDB8 +S31508001FD80FC695E8030086E80300231D0ECB38468E +S31508001FE801F0ACFA054660B9002384F838300123B5 +S31508001FF884F8BD33636A012B08D0206801F093FE84 +S315080020089EE7022384F8BD33012599E7204600F0A8 +S3150800201819FDF2E7012593E7704790F8BC33012BC1 +S3150800202801D10220704710B50446012380F8BC3355 +S31508002038006801F06CFE206801F02EFA002084F88A +S31508002048BC0310BD38B590F8BC33012B02D1022564 +S31508002058284638BD0446012380F8BC33006801F0D9 +S3150800206821FA206801F01FFE054620B1002384F8EE +S31508002078BC330125ECE7206801F055FE002384F8F7 +S31508002088BC33E5E768B110B50446032380F8BD33C9 +S31508002098FFF7D8FF2046FFF7BFFF002084F8BD03E7 +S315080020A810BD01207047000070B504460D4600684B +S315080020B8066C00EB411303F5306399682269012A17 +S315080020C811D0374A964254D03DB9C5EBC50293009C +S315080020D82344D3F81032002B5CD0E9B2204602F02C +S315080020E803FE002070BD11F0080F09D02D4A96424C +S315080020F8F7D911F4004FF4D04FF400429A60F0E78C +S3150800210811F0200F28D111F0280FEAD1254A964256 +S3150800211802D911F4004F22D1E900491B8A0022444A +S31508002128D2F804121B69C3F31203C91AC2F81412A7 +S31508002138D2F80412D2F808320B44C2F8083235B974 +S31508002148C5EBC50293002344D3F810325BB1E9B254 +S31508002158204602F0C9FDC4E720229A60C1E74FF479 +S3150800216800429A60BDE704F57172012101F02CFE60 +S31508002178EDE711F4004F09D111F0200F01D0202204 +S315080021889A60E9B2204602F0AFFDAAE74FF400428A +S315080021989A60A6E704F57172002101F015FE9CE71E +S315080021A80A31544F0A30544F38B5044603681D6C33 +S315080021B803EB4111D1F8082B0E4B9D4207D901F5BF +S315080021C8306112F4004F02D04FF400438B6020466A +S315080021D802F082FD074B9D4202D92369012B01D0E3 +S315080021E8002038BD04F571720121206801F0ECFD64 +S315080021F8F6E700BF0A30544F2DE9F84F044605683C +S31508002208284601F0CCFD08B1BDE8F88F2F460646EA +S31508002218206801F094FD0028F6D0206801F08FFDAB +S3150800222810F0020F04D02268536903F002035361C1 +S31508002238206801F084FD10F0100F15D02268936904 +S3150800224823F010039361D5F8208008F00F09C8F326 +S315080022584343022B00F08580062B00F0A5802268F0 +S31508002268936943F010039361206801F068FD10F440 +S31508002278002F40F0AD80206801F061FD10F4802F32 +S3150800228840F0F180206801F05AFD0028C0F25F810D +S31508002298206801F054FD10F4006F0AD0D5F8083804 +S315080022A813F0010F40F06D812268536903F4006347 +S315080022B85361206801F043FD10F0006F15D02268BD +S315080022C8536903F00063536194F8F433002B40F024 +S315080022D85C81012184F8F41323685B6DC3F38303D7 +S315080022E8C4F8F833204600F0C1FB206801F027FD42 +S315080022F810F4805F40F04D81206801F020FD10F44D +S31508002308005F40F0AB81206801F019FD10F0080F56 +S3150800231840F0BC81206801F012FD10F4801F40F0DF +S31508002328BE81206801F00BFD10F4001F40F0C18142 +S31508002338206801F004FD10F0804F40F0C481206841 +S3150800234801F0FDFC10F0040F3FF45EAF23685D68EA +S3150800235815F0040F40F0C08123685A6815435D607C +S3150800236852E747F6F07318EA030F3FF478AF4FEAD7 +S31508002378C90BABEB09034FEA830AA2444FEA1818BC +S31508002388C8F30A02DAF80812284601F01DFCC8F351 +S315080023980A08DAF808324344CAF80832DAF814326E +S315080023A84344CAF814325AE7082204F571712846D4 +S315080023B801F00AFCC8F30A184FEAC903A3EB090196 +S315080023C88A002244D2F814324344C2F8143246E743 +S315080023D8206801F0B8FC8046B14617E007EB4913B8 +S315080023E80122C3F8082B49462046FFF75DFE1DE083 +S315080023F807EB49130822C3F8082B49462046FFF776 +S31508002408D3FE16E009F101094FEA5808B8F1000F9A +S315080024183FF431AF18F0010FF4D05FFA89F120685C +S3150800242801F0A1FC824610F0010FD7D11AF0080F67 +S31508002438DED11AF0100F04D007EB49131022C3F89F +S31508002448082B1AF0200F04D007EB49132022C3F8EB +S31508002458082B1AF4005FD5D007EB49134FF400523E +S31508002468C3F8082BCEE7206801F075FC8046B1460C +S315080024782AE05946204602F043FC1AF0080F04D011 +S3150800248807EB49130822C3F808291AF0100F04D0D5 +S3150800249807EB49131022C3F808291AF0400F04D08D +S315080024A807EB49134022C3F808291AF0020F04D08B +S315080024B807EB49130222C3F808291AF0800F41D1FD +S315080024C809F101094FEA5808B8F1000F3FF4DAAEE6 +S315080024D818F0010FF4D05FFA89FB5946206801F015 +S315080024E84BFC824610F0010FC7D009F00F030121F3 +S315080024F801FA03F2D7F8343823EA0203C7F834385E +S3150800250807EB4913C3F8081923698B42B1D14FEA77 +S31508002518C902A2EB090293002344596C9A6C0A442F +S315080025289A64B9F1000FA4D1C9EBC90293002344F0 +S315080025381B6D002B9DD104F571720121206801F0ED +S3150800254843FC96E749462046FFF764FCB8E7D5F802 +S31508002558043823F00103C5F8043894F8F433012B3A +S3150800256808D0204602F012FC2268536903F000439B +S3150800257853618DE6002184F8F413204600F076FAB4 +S31508002588F2E7204602F0E8FB8EE6204602F0E4FB76 +S31508002598ABE605F50068D8F8043023F00103C8F857 +S315080025A804301021206800F09BFF20E007EB461353 +S315080025B84FF67F31C3F80819D3F8002922F4001218 +S315080025C8C3F80029D3F8002942F00062C3F80029A5 +S315080025D8C3F8081BD3F8002B22F40012C3F8002B03 +S315080025E8D3F8002B42F00062C3F8002B0136636863 +S315080025F89E42DBD3D8F81C3043F00113C8F81C30C8 +S31508002608236BEBB1D8F8843043F00B03C8F8843051 +S31508002618D8F8443043F00B03C8F84430D5F80038E6 +S3150800262823F4FE63C5F8003804F57172217C206826 +S3150800263801F0CAFB2268536903F4805353615BE6C9 +S31508002648D8F8142042F22B031343C8F81430D8F8E4 +S31508002658103043F00B03C8F81030DFE7206801F0A4 +S31508002668A3FB206801F03EF8E060256800F000FA50 +S31508002678227B0146284600F099FE204602F052FBC6 +S315080026882268536903F4005353613CE6204602F076 +S3150800269842FB2268536903F0080353613AE60021AE +S315080026A8204602F082FB2268536903F480135361BB +S315080026B837E60021204602F072FB2268536903F4C4 +S315080026C80013536134E6204602F075FB2268536905 +S315080026D803F08043536132E6204602F076FB3BE678 +S315080026E890F8BC33012B01D10220704710B5044677 +S315080026F8012380F8BC33006801F009FB002084F840 +S31508002708BC0310BD90F8BC33012B01D102207047D9 +S3150800271810B50446012380F8BC33006801F003FBB2 +S31508002728002084F8BC0310BD90F8BC33012B01D1F6 +S315080027380220704710B50446012380F8BC3380F898 +S315080027483810006801F0D3FA002084F8BC0310BDDD +S31508002758F8B511F0800F1ED101F00F06F500AF1B72 +S31508002768BC00274604F5FC74044404343E46064473 +S31508002778002586F8FD5101F00F012170A260E3706B +S31508002788627802B1E180022B14D090F8BC33012B91 +S3150800279813D10220F8BD01F00F06F500AF1BBC00E7 +S315080027A827463834044404343E460644012586F848 +S315080027B83D50E0E700232371E7E70546012380F843 +S315080027C8BC332146006800F09DFF002085F8BC034D +S315080027D8F8BD38B511F0800F17D101F00F04E200E3 +S315080027E8151BAB001D4603F5FC73034404332C463E +S315080027F80444002284F8FD2101F00F01197090F8AD +S31508002808BC23012A10D1022038BD01F00F04E200CA +S31508002818151BAB001D463833034404332C460444C1 +S31508002828012284F83D20E7E70446012280F8BC2304 +S315080028381946006800F0AEFF002084F8BC0338BDCE +S3150800284870B501F00F05EE00711B8C0004F5FC74D9 +S315080028580444211D761BB4000444C4F80822C4F8AD +S3150800286810320023C4F8143284F8FD3184F8FC5178 +S315080028780369012B06D065B1DAB2006801F098F849 +S31508002888002070BDC5EBC506B4000444C4F80C2284 +S31508002898F1E7DAB2006800F0EBFFF1E701F00F01A3 +S315080028A8C1EBC1018B001844D0F81402704770B503 +S315080028B801F00F05EE00711B8C0038340444211D05 +S315080028C8761BB4000444A2642365002363650123C8 +S315080028D884F83D3084F83C500369012B06D05DB175 +S315080028E8DAB2006801F064F8002070BDC5EBC506C9 +S315080028F8B4000444E264F2E7DAB2006800F0B8FF0C +S31508002908F2E738B501F00F0543689D4238D811F04B +S31508002918800F15D1CA00541AA3001C4603F5FC7388 +S315080029280344043322460244002182F8FD11012299 +S315080029389A701D7090F8BC23012A0DD1022038BD63 +S31508002948EA00511B8B001946383303440433014403 +S31508002958012281F83D20EAE70446012280F8BC23D3 +S315080029681946006801F044F91DB1002084F8BC0333 +S3150800297838BD04F57172217C206801F025FAF4E760 +S31508002988012038BD01F00F03426893422FD810B5CD +S3150800299811F0800F14D1DA00D41AA1000C4601F5FB +S315080029A8FC71014404310444002284F8FD21002204 +S315080029B88A700B7090F8BC33012B0DD1022010BD1C +S315080029C8DA00D41AA1000C4638310144043104440B +S315080029D8012284F83D20EAE70446012380F8BC333F +S315080029E8006801F032F9002084F8BC0310BD012004 +S315080029F8704730B40468606A29B10D46A36A00EBCB +S31508002A08134000230CE040EA0240A06212E003F1FA +S31508002A18400104EB8101496800EB11400133DBB240 +S31508002A28691E8B42F3D340EA024005F13F0104EBE5 +S31508002A3881014860002030BC70470368596200204D +S31508002A4870470000024603680121C0F8FC130020FD +S31508002A5882F8F4039A6942F000629A61596D024A4B +S31508002A680A435A65704700BF030000107047000004 +S31508002A78014B1868704700BF08000020534B98425E +S31508002A881FD0534B984228D0524B984231D0524BBC +S31508002A9898423AD0514B984243D0514B98424CD021 +S31508002AA8504B984255D0504B98425ED04F4B98425F +S31508002AB867D04F4B984270D04E4B984279D0012038 +S31508002AC8704703F560531A6942F001021A611A69D8 +S31508002AD822F001021A610020704703F550531A695B +S31508002AE842F002021A611A6922F002021A610020EB +S31508002AF8704703F540531A6942F004021A611A69C5 +S31508002B0822F004021A610020704703F530531A6947 +S31508002B1842F008021A611A6922F008021A610020AE +S31508002B28704703F520531A6942F010021A611A69A8 +S31508002B3822F010021A610020704703F510531A692B +S31508002B4842F020021A611A6922F020021A6100204E +S31508002B58704703F500531A6942F040021A611A6968 +S31508002B6822F040021A610020704703F5E0531A69FB +S31508002B7842F080021A611A6922F080021A6100205E +S31508002B88704703F5C0531A6942F480721A611A69C4 +S31508002B9822F480721A610020704703F5A0531A6957 +S31508002BA842F400721A611A6922F400721A61002046 +S31508002BB8704703F580531A6942F480621A611A69E4 +S31508002BC822F480621A610020704700BF00000240A4 +S31508002BD80004024000080240000C024000100240AF +S31508002BE80014024000180240001C0240002002405F +S31508002BF80024024000280240F0B50C6894FAA4F4B0 +S31508002C08B4FA84F44BE08E68826893FAA3F5B5FAA9 +S31508002C1885F56D00032707FA05F522EA050293FAF2 +S31508002C28A3F5B5FA85F56D0006FA05F52A43826017 +S31508002C380E68CD68426822EA060205FB06F52A43AD +S31508002C48426038E04D69466A1A0A92FAA2F7B7FA54 +S31508002C5887F7BF004FF00F0E0EFA07F726EA0706A2 +S31508002C6892FAA2F2B2FA82F2920005FA02F2324314 +S31508002C7842624D68026893FAA3F6B6FA86F67600B3 +S31508002C88032707FA06F622EA060293FAA3F3B3FA23 +S31508002C9883F35B0005FA03F31343036001340B68F7 +S31508002CA833FA04F23BD00122A2401340F6D04A6810 +S31508002CB8013A012AA7D90E69C26893FAA3F5B5FAA3 +S31508002CC885F56D00032707FA05F522EA050293FA42 +S31508002CD8A3F5B5FA85F56D0006FA05F52A43C26027 +S31508002CE84A68022AC5D193FAA3F2B2FA82F2072AE7 +S31508002CF8A8D84E69026A93FAA3F5B5FA85F5AD0020 +S31508002D080F2707FA05F522EA050293FAA3F5B5FA95 +S31508002D1885F5AD0006FA05F52A430262A9E70020FB +S31508002D28F0BD000082B0224A136843F0010313601D +S31508002D381F4B1B6813F0020FFAD01D4B00229A602E +S31508002D481A68019201991B4A0A400192019A1A6067 +S31508002D581A6822F0F80242F080021A60144B1B68BF +S31508002D6813F0007FFAD1124B1B6813F0006FFAD1E3 +S31508002D780F4B1B6813F0005FFAD10D4B0E4A5A60C9 +S31508002D88103AC3F88420C3F88820DA6822F4FE4289 +S31508002D98DA60DA6842F47F02DA605A6F22F00102D2 +S31508002DA85A675A6F42F080725A67002002B0704715 +S31508002DB800380240FFFFF2EA10300024034B9B68F4 +S31508002DC8C3F30313024AD35CD8407047003802405D +S31508002DD8CC510008034B9B68C3F38223024AD35C91 +S31508002DE8D840704700380240DC510008034B9B68FE +S31508002DF8C3F34233024AD35CD840704700380240CE +S31508002E08DC5100080D4B5B6803F480030BB90C48CA +S31508002E1800E00C48094A536803F03F03B0FBF3F394 +S31508002E285068C0F3881000FB03F05368C3F30143E6 +S31508002E3801335B00B0FBF3F0704700BF003802406F +S31508002E480024F40000127A0008B5074B9B6803F0C3 +S31508002E580C03042B06D0082B01D0044808BDFFF73D +S31508002E68D1FF08BD024808BD003802400024F40016 +S31508002E7800127A0010B50446FFF7E6FF2060FFF750 +S31508002E889DFF6060FFF7A6FFA0606068FFF7AEFFCA +S31508002E98E06010BD08B5032809D00C2833D0B0F572 +S31508002EA8406F5CD0302800F08780002008BD584B5A +S31508002EB8D3F89030034043EA0040564B98420FD067 +S31508002EC8B0F1031F15D0013B984206D0FFF7BCFFA7 +S31508002ED8FFF774FFFFF78AFF08BDFFF7B5FF08BDC0 +S31508002EE84B4B1B6813F0020F01D04B4808BD002056 +S31508002EF808BD474B1B6F13F0020F02D04FF4004072 +S31508002F0808BD002008BD424BD3F89030034043EA79 +S31508002F180040424B98420FD0B0F10C1F15D0043B25 +S31508002F28984206D0FFF790FFFFF748FFFFF752FFD2 +S31508002F3808BDFFF789FF08BD354B1B6813F0020F5C +S31508002F4801D0354808BD002008BD314B1B6F13F06A +S31508002F58020F02D04FF4004008BD002008BD2C4BD4 +S31508002F68D3F89030034043EA00402D4B984210D0DE +S31508002F78B0F10C2F16D0A3F58063984206D0FFF758 +S31508002F8863FFFFF71BFFFFF731FF08BDFFF75CFF7D +S31508002F9808BD1F4B1B6813F0020F01D01E4808BD59 +S31508002FA8002008BD1A4B1B6F13F0020F02D04FF40E +S31508002FB8004008BD002008BD154BD3F890300340E3 +S31508002FC843EA0040174B98420FD0B0F1301F15D08E +S31508002FD8103B984206D0FFF737FFFFF7EFFEFFF7DB +S31508002FE8F9FE08BDFFF730FF08BD094B1B6813F04B +S31508002FF8020F01D0084808BD002008BD044B1B6F06 +S3150800300813F0020F02D04FF4004008BD002008BD97 +S3150800301800380240020003000024F40008000C00EF +S315080030280008000C2000300008B5C0280BD0B0F501 +S31508003038407F34D0B0F5405F5ED0B0F5404F00F021 +S315080030488880002008BD594BD3F89030034043EADE +S315080030580040574B98420FD0B0F1C01F15D0403BDF +S31508003068984206D0FFF7F0FEFFF7A8FEFFF7B2FE74 +S3150800307808BDFFF7E9FE08BD4C4B1B6813F0020FA5 +S3150800308801D04C4808BD002008BD484B1B6F13F0FB +S31508003098020F02D04FF4004008BD002008BD434B7C +S315080030A8D3F89030034043EA0040434B984210D087 +S315080030B8B0F1032F16D0A3F58073984206D0FFF710 +S315080030C8C3FEFFF77BFEFFF785FE08BDFFF7BCFECC +S315080030D808BD364B1B6813F0020F01D0354808BDEA +S315080030E8002008BD314B1B6F13F0020F02D04FF4B6 +S315080030F8004008BD002008BD2C4BD3F8903003408B +S3150800310843EA00402D4B984210D0B0F1302F16D024 +S31508003118A3F58053984206D0FFF796FEFFF74EFEB2 +S31508003128FFF758FE08BDFFF78FFE08BD1F4B1B6843 +S3150800313813F0020F01D01F4808BD002008BD1B4B1D +S315080031481B6F13F0020F02D04FF4004008BD002091 +S3150800315808BD164BD3F89030034043EA0040184B95 +S31508003168984210D0B0F1C02F16D0A3F580439842E4 +S3150800317806D0FFF769FEFFF721FEFFF72BFE08BD0D +S31508003188FFF762FE08BD094B1B6813F0020F01D052 +S31508003198084808BD002008BD044B1B6F13F0020F32 +S315080031A802D04FF4004008BD002008BD0038024090 +S315080031B88000C0000024F40000020003002000304C +S315080031C8008000C038B5036813F0010F46D0012304 +S315080031D8002B77D10D46044603683D4A1A404B68CA +S315080031E8C9680B4329690B43A9690B431343036051 +S315080031F8AB68426822F44052134343606B6982689D +S3150800320822F4407213438360324B984228D0324BDB +S31508003218984229D0314B98422AD0314B98422BD024 +S31508003228304B98422CD0304B98422ED02F4B984290 +S3150800323830D02F4B984232D00020002844D02B6833 +S31508003248002B43D0AA69B2F5004F2DD000EB5300E6 +S31508003258B0FBF3F080B2E060002038BD0023B7E782 +S315080032680320FFF717FEE8E70C20FFF713FEE4E74D +S315080032783020FFF70FFEE0E7C020FFF7D5FEDCE7B2 +S315080032884FF44070FFF7D0FED7E74FF44060FFF7DA +S3150800329801FED2E74FF44050FFF7C6FECDE74FF4DC +S315080032A84040FFF7C1FEC8E75A0802EB4000B0FBEA +S315080032B8F3F04FF6F0730340C0F342001843E0609A +S315080032C8002038BD012038BD012038BD012038BD91 +S315080032D8F369FFEF00100140004400400048004031 +S315080032E8004C00400050004000140140007800409F +S315080032F8007C0040002301330C4A934211D8026926 +S31508003308002AF8DA036943F001030361002301334D +S31508003318064A934207D8026912F0010FF7D100202E +S315080033287047032070470320704700BF400D03000D +S3150800333884B010B5044603A880E80E00089B012B44 +S3150800334811D0E36843F04003E3602046FFF7D2FF55 +S31508003358A36B43F48033A363069B012B1BD0BDE8FC +S31508003368104004B07047A36B23F48033A363E26864 +S315080033780D4B1340E360E36823F44013E3600F9BA7 +S31508003388012B03D02046FFF7B5FFE5E7E36843F4CA +S315080033988013E360F6E7A36843F00603A360A3680F +S315080033A843F02003A360DAE7BFFFBDFF022A0AD06D +S315080033B80921C26822F47052C260C36843EA8123AD +S315080033C8C36000207047274B0B44274A934239D9D4 +S315080033D8264B0B44264A934236D9264B0B44264A93 +S315080033E8934233D9254B0B4402F5C332A032934294 +S315080033F82ED9234B0B44234A93422BD9224B0B44F1 +S3150800340802F5922202F57872934225D91F4B0B448E +S3150800341802F5C32202F5207293421FD91C4B0B44AE +S3150800342802F5B71202F55872934219D9194B0B448B +S3150800343802F5122202F5F862934201D90621B8E785 +S315080034480721B6E70F21B4E70E21B2E70D21B0E749 +S315080034580C21AEE70B21ACE70A21AAE70921A8E760 +S315080034680821A6E7405327FFFF340C00401E1BFF20 +S315080034783F420F0000DC0BFF7F4F1200808CF9FEDD +S3150800348860B6E5FE5FE3160000D3CEFEC05BB3FE6A +S3150800349800CA91FEE05459FE836843F0010383602D +S315080034A800207047836823F0010383600020704773 +S315080034B808B5C36823F0C043C360012909D069B9B0 +S315080034C8C36843F08043C3603220FDF7FDFF002040 +S315080034D808BDC36843F00053C360F5E7012008BD7B +S315080034E8890141F02001016100230133054A93420D +S315080034F805D8026912F0200FF7D10020704703207B +S31508003508704700BF400D03001023036100230133F1 +S31508003518054A934205D8026912F0100FF7D1002020 +S3150800352870470320704700BF400D0300D0F80038E5 +S315080035381943C0F8001800207047000084B02DE928 +S31508003548F041044607A880E80E002546002306E051 +S3150800355803F1400204EB82020021516001330E2B6D +S31508003568F6D9119B002B36D1D4F8043843F0020358 +S31508003578C4F80438A36B23F40013A363236843F041 +S3150800358840032360236843F0800323600023C4F8BC +S31508003598003E04F50066D4F80038C4F800380C9BD9 +S315080035A8012B1DD0032B27D003212046FFF7BEFF8A +S315080035B810212046FFF794FF804608B14FF001080E +S315080035C82046FFF7A1FF08B14FF001080023336131 +S315080035D87361F36127E0A36B43F40013A363D5E78C +S315080035E8099B23B900212046FFF7A0FFE0E7012140 +S315080035F82046FFF79BFFDBE7099B23B900212046F6 +S31508003608FFF794FFD4E701212046FFF78FFFCFE79E +S31508003618C3B94FF00060C2F8000900220A614FF6E4 +S315080036287F328A60013307998B4210D205EB431221 +S3150800363802F51061D2F800090028E9DB0020C2F873 +S315080036480009EAE74FF09040C2F80009E5E70023C9 +S315080036580AE0BBB14FF09047C2F8007B002202612E +S315080036684FF67F32826001338B4210D205EB431244 +S3150800367802F53060D2F8007B002FEADB0027C2F893 +S31508003688007BEBE74FF00067C2F8007BE6E7336993 +S3150800369823F4807333610023A3616FF08043636169 +S315080036A80A9B1BB9A36943F01003A361A2690B4BD4 +S315080036B81343A3610D9B1BB1A36943F00803A361D8 +S315080036C8119B012B04D04046BDE8F04104B0704771 +S315080036D8A269034B1343A361F5E700BF00383C8092 +S315080036E804000040D0F8083813F0060305D0062B66 +S315080036F818BF022B03D102207047002070470F20FD +S315080037087047000070B40B784A78012A20D0D0F8A0 +S315080037181C2803F00F060124B44042EA0442C0F804 +S315080037281C2800EB4310D0F8003B13F4004F0CD1CB +S31508003738D0F8002B8B68C3F30A03C97843EA814398 +S315080037481343134A1A43C0F8002B002070BC70476D +S31508003758D0F81C4803F00F06B24092B22243C0F8CC +S315080037681C2800EB4310D0F8002912F4004FECD1BE +S31508003778D0F800498A68C2F30A02C97842EA81423F +S3150800378842EA83532343024A1A43C0F80029DCE76E +S315080037980080001030B40B784A78012A24D000EB50 +S315080037A84313D3F8002B002A50DBD0F83C580A7884 +S315080037B802F00F02012404FA02F225EA0242C0F8CE +S315080037C83C28D0F81C28097801F00F018C4022EA19 +S315080037D80444C0F81C48D3F8001B234A0A40C3F817 +S315080037E8002B002030BC704700EB4313D3F80029A0 +S315080037F8002A1EDBD0F83C580A7802F00F0201248A +S3150800380804FA02F292B225EA0202C0F83C28D0F875 +S315080038181C28097801F00F018C40A4B222EA040496 +S31508003828C0F81C48D3F80019104A0A40C3F80029FA +S31508003838D7E7D3F8002942F00062C3F80029D3F87D +S31508003848002942F08042C3F80029D3E7D3F8002BB1 +S3150800385842F00062C3F8002BD3F8002B42F08042EE +S31508003868C3F8002BA1E700BF0078F3EF007833EC24 +S3150800387870B40B784C78012C24D000EB431000F573 +S3150800388830631D693E4C2C401C611D693D4C2C401B +S315080038981C614C690CB18C684C611C6944F40024A1 +S315080038A81C611C698D68C5F312052C431C61012A25 +S315080038B861D0D0F8003B43F00443C0F8003B002031 +S315080038C870BC70474C695CBB00EB4314D4F81069AC +S315080038D82C4D3540C4F81059D4F8105945F400252C +S315080038E8C4F81059D4F81069254D3540C4F810594C +S315080038F8012A31D000EB4313D3F8002942F00442D9 +S31508003908C3F800294B69002BD9D0D0F83428097890 +S3150800391801F00F040121A1400A43C0F83428CEE774 +S3150800392800EB431404F510642669154D35402561E6 +S315080039382669144D354025614E698D68AE4200D911 +S315080039484D61256945F40025256125694E69C6F343 +S31508003958120635432561CBE70A691AB100EB43110C +S31508003968C1F8142900EB4310D0F8002942F00442A4 +S31508003978C0F80029A3E7CA68002A9AD05A6198E7C6 +S315080039880000F8FFFFFF07E070B49DF80C4064B923 +S3150800399803339E0807E000EB023303F5805351F81A +S315080039A8045B1D600134B442F5D3002070BC70472F +S315080039B8F0B583B00C784B78012B29D000EB44146A +S315080039C804F530631E697D4D35401D611E697C4DC1 +S315080039D835401D614D69002D40F0C1801D698E680E +S315080039E8C6F3120635431D611D6945F400251D6198 +S315080039F8012A00F0C980CB78012B00F0CB80D4F8D7 +S31508003A08003B43F00443C4F8003B002003B0F0BD74 +S31508003A184B6973BB00EB4413D3F81069684D3540FE +S31508003A28C3F81059D3F8105945F40025C3F81059A6 +S31508003A38D3F81069614D3540C3F81059012A4AD0A0 +S31508003A4800EB4414D4F8003943F00443C4F80039A9 +S31508003A58CB78012B68D04B69002BD6D0D0F83438F0 +S31508003A680A7802F00F0101228A401343C0F8343855 +S31508003A78CBE700EB4413D3F81069504D3540C3F82B +S31508003A881059D3F810694E4D3540C3F81059D3F874 +S31508003A9810694D698F683D44013DB5FBF7F5494FF7 +S31508003AA807EAC5453543C3F81059D3F810594E697E +S31508003AB8C6F312063543C3F8105903F51063CD78D3 +S31508003AC8012DBBD11D6925F0C0451D611D6945F04D +S31508003AD800551D61B2E70B691BB100EB4412C2F829 +S31508003AE81439CB78012B08D000EB4414D4F80039E4 +S31508003AF843F00443C4F8003987E7D0F8083813F4C4 +S31508003B08807F08D100EB4412D2F8003943F00053FD +S31508003B18C2F80039E8E700EB4412D2F8003943F056 +S31508003B288053C2F80039DFE7D0F8083813F4807FE5 +S31508003B380ED1D4F8003943F00053C4F800391446B6 +S31508003B480B46C9681A789B8A0094FFF71DFF5CE73D +S31508003B58D4F8003943F08053C4F80039EFE78E6883 +S31508003B683544013DB5FBF6F51E69164F07EAC54704 +S31508003B783E431E611F698E68ADB206FB05F5C5F39F +S31508003B8812053D431D6133E7CA68002A3FF433AF7F +S31508003B985A6130E7D0F8083813F4807F06D1D4F88C +S31508003BA8003B43F00053C4F8003B28E7D4F8003B31 +S31508003BB843F08053C4F8003B21E700BF0000F8FF34 +S31508003BC8FFFF07E00000F81F03329208002393421C +S31508003BD80CD210B400F58054246841F8044B01331C +S31508003BE89342F7D308465DF8044B70470846704772 +S31508003BF80B784A78012A14D000EB4310D0F8002B2A +S31508003C08002A06DB2BB1D0F8003B23F08043C0F826 +S31508003C18003BD0F8003B43F40013C0F8003B0020F3 +S31508003C28704700EB4310D0F80029002A06DB2BB1B1 +S31508003C38D0F8003923F08043C0F80039D0F80039A5 +S31508003C4843F40013C0F80039E9E70B784A78012AE3 +S31508003C580ED000EB4310D0F8003B23F40013C0F84D +S31508003C68003BCB78023BDBB2012B15D90020704705 +S31508003C7800EB4310D0F8003923F40013C0F80039D4 +S31508003C88CB78023BDBB2012BF0D8D0F8003943F0E9 +S31508003C988053C0F80039E9E7D0F8003B43F0805371 +S31508003CA8C0F8003BE2E738B505460446002208E0B6 +S31508003CB804EB42134FF67F31C3F80819C3F8081BFB +S31508003CC801320E2AF4D90022C5F81028C5F8142896 +S31508003CD8C5F81C282846FFF717FC034608B11846F6 +S31508003CE838BD10212846FFF7FBFB0346F7E7D0F84F +S31508003CF8003823F4FE63C0F80038D0F80038090104 +S31508003D0801F4FE610B43C0F800380020704708B577 +S31508003D18D0F8043823F00203C0F804380320FDF766 +S31508003D28D3FB002008BD08B5D0F8043843F00203D1 +S31508003D38C0F804380320FDF7C7FB002008BD426910 +S31508003D48806910407047D0F8183800F50060C069D7 +S31508003D581840000C7047D0F8183800F50060C0699C +S31508003D68184080B2704700EB4111D1F8082B00F5CE +S31508003D78006040691040704710B4D0F81028D0F891 +S31508003D88343801F00F04E340DB01DBB2134300EBE0 +S31508003D984111D1F8080918405DF8044B7047406985 +S31508003DA800F0010070470000D0F80029054B1340C1 +S31508003DB8C0F80039D0F8043843F48073C0F80438DA +S31508003DC80020704700F8FFFF10B4046C154B9C429E +S31508003DD803D9D0F8003B002B16DB0024C0F8104B9B +S31508003DE8D0F8104B44F40024C0F8104BD0F8104B08 +S31508003DF844F01804C0F8104BD0F8104B44F0C044EF +S31508003E08C0F8104B012903D000205DF8044B704711 +S31508003E18C0F8142BD0F8003B43F08023C0F8003BC9 +S31508003E28F2E700BF0A30544F014B1860704700BFCD +S31508003E3808000020C0B108B50346D0F8B80210B18A +S31508003E480020C3F8B802D3F8CC0210B10020C3F892 +S31508003E58CC0209B1C3F8B4121846012380F89C327B +S31508003E68027000F0BDFF08BD0320704710B5044670 +S31508003E78012380F89C32D0F8B83213B15B6801790F +S31508003E889847D4F8CC3213B10023C4F8CC3220466C +S31508003E9801F016F8034608B1184610BD204600F08A +S31508003EA8FFFF0346F8E710B582B00023ADF80630E1 +S31508003EB859B10446C4F8B812CB6A0DF106009847FA +S31508003EC8C4F8CC02002002B010BD0320FBE708B5F1 +S31508003ED800F0EEFF08BD08B5D0F8B83213B11B6874 +S31508003EE8984708BD032008BD08B5D0F8B8320BB105 +S31508003EF85B689847002008BD38B5044600F2AA252D +S31508003F08284600F02FF90123C4F89432B4F8B032E1 +S31508003F18C4F8983294F8AA1201F01F03012B0DD0A1 +S31508003F283BB1022B0FD001F08001204600F0E3FFD9 +S31508003F3838BD2946204600F0F0FA38BD29462046FD +S31508003F4800F026FB38BD2946204600F055FB38BD4B +S31508003F5810B5044631BB1346D0F89422032A01D07B +S31508003F68002010BDD0F85C11D0F8602191420CD819 +S31508003F78D0F8B8321B691BB190F89C22032A0FD0D7 +S31508003F88204600F076FC002010BD891AC0F85C119E +S31508003F988A4228BF0A46194600F063FC002010BD6D +S31508003FA89847EDE70A46D0F8B8329B6943B190F8C6 +S31508003FB89C12032901D0032010BD1146984710BD4D +S31508003FC8032010BD10B50446002947D11346D0F87A +S31508003FD89422022A05D094F8A032012B3AD0002060 +S31508003FE810BDC269016A8A4211D88A421BD0D4F820 +S31508003FF8B832DB681BB194F89C22032A27D08021A3 +S31508004008204600F078FF204600F03EFCE3E7521A07 +S31508004018C261194600F01DFC00231A4619462046B7 +S3150800402800F089FFD7E783699942E0D8D0F8982243 +S315080040389342DCD20022114600F00BFC0021C4F89A +S3150800404898120B460A46204600F075FFC3E7204635 +S315080040589847D4E7002084F8A00210BD0A46D0F88D +S31508004068B8325B6943B190F89C12032901D0032042 +S3150800407810BD1146984710BD032010BD70B50446FB +S31508004088012380F89C320023C0F894324360C0F8B4 +S31508004098A432D0F8BC3223B1D0F8B8325B68002114 +S315080040A89847402300221146204600F011FF0126B2 +S315080040B8A4F864614025C4F860512B460022802183 +S315080040C8204600F005FFA6842562002070BD01740D +S315080040D80020704790F89C3280F89D32042380F8B7 +S315080040E89C320020704790F89C32042B01D000209F +S315080040F8704790F89D3280F89C32F8E708B590F832 +S315080041089C32032B01D0002008BDD0F8B832DB69F1 +S31508004118002BF8D09847F6E700207047002070472C +S315080041280020704708B5012380F89C32D0F8B832C9 +S3150800413813B15B6801799847002008BD002302E09F +S315080041480133DBB201300278002AF9D118467047E4 +S3150800415808B54B88012B00D008BDC0F8A43200F07A +S3150800416888FBF9E70B7803704B7843708B78CA7825 +S3150800417843EA022343800B794A7943EA0223838078 +S315080041888B79CA7943EA0223C380704710B5044677 +S31508004198802100F0B0FE0021204600F0ACFE10BDDC +S315080041A830B583B004460D460023ADF806304A8874 +S315080041B8130A013B062B00F2C980DFE803F0042145 +S315080041C837C7C7A5B500D0F8B4321B680DF1060184 +S315080041D8007C984700238BB9EA88002A00F0C1803A +S315080041E8BDF80630002B00F0B7809A4228BF1A4659 +S315080041F8ADF806200146204600F01EFB03B030BD88 +S31508004208037C4BB9D0F8B8329B6A0DF1060098477B +S31508004218022343700023DEE7D0F8B832DB6A0DF1D3 +S3150800422806009847022343700023D4E7D2B2052A2A +S3150800423864D8DFE802F0031323334353D0F8B432C3 +S315080042485B682BB10DF10601007C98470023C2E78D +S315080042582946FFF79BFF01230020BCE7D0F8B432B4 +S315080042689B682BB10DF10601007C98470023B2E73D +S315080042782946FFF78BFF01230020ACE7D0F8B432B4 +S31508004288DB682BB10DF10601007C98470023A2E7ED +S315080042982946FFF77BFF012300209CE7D0F8B432B4 +S315080042A81B692BB10DF10601007C9847002392E79C +S315080042B82946FFF76BFF012300208CE7D0F8B432B4 +S315080042C85B692BB10DF10601007C9847002382E74C +S315080042D82946FFF75BFF012300207CE7D0F8B432B4 +S315080042E89B692BB10DF10601007C9847002372E7FC +S315080042F82946FFF74BFF012300206CE72946FFF7FD +S3150800430845FF0123002066E7037C3BB9D0F8B8329D +S315080043185B6B0DF10600984700235CE72946FFF713 +S3150800432835FF0123002056E7037C4BB9D0F8B8328D +S315080043381B6B0DF1060098470723437000234AE7CD +S315080043482946FFF723FF0123002044E72946FFF7FC +S315080043581DFF012300203EE729462046FFF716FFE2 +S315080043684CE7204600F085FA48E738B504468B88B6 +S31508004378F3B9CB88E3B94B887F2B19D803F07F05A7 +S3150800438890F89C32032B0CD080F89E52294600F0F0 +S31508004398C2FD204600F06DFA35B1022384F89C3236 +S315080043A838BDFFF7F3FE38BD012384F89C3238BDC3 +S315080043B82046FFF7EBFE38BD70B504460D468978EA +S315080043C82E4B1970012905D92946FFF7DFFE032662 +S315080043D8304670BD90F89C32022B0BD0032B1FD0A9 +S315080043E82946FFF7D3FE254B19782046FFF77CFDAB +S315080043F80326EDE781B14160FFF76DFD064620B15A +S3150800440829462046FFF7C2FEE2E7204600F031FAC1 +S31508004418032384F89C32DBE700F02BFA0026D7E75B +S31508004428C9B14368994225D0D9B2FFF75DFD134B48 +S31508004438197861602046FFF74EFD0646B0B1294651 +S315080044482046FFF7A3FE21792046FFF74DFD0223F4 +S3150800445884F89C32BCE7022380F89C324160FFF757 +S3150800446843FD204600F005FA0026B1E7204600F08D +S3150800447800FAADE700F0FDF90026A9E7080A0020CA +S3150800448808B5CB88012B0BD190F89C329BB1022B2F +S3150800449809D9032B0FD10122011D00F0CDF908BD5A +S315080044A8FFF774FE08BD0146002341F8083F0122BC +S315080044B800F0C2F908BDFFF769FE08BD08B590F80F +S315080044C89C32013B022B12D8CB88022B0CD1012334 +S315080044D8C360D0F8A4320BB10323C360022200F1EB +S315080044E80C0100F0A9F908BDFFF750FE08BDFFF753 +S315080044F84DFE08BD08B590F89C32013B022B09D839 +S315080045084B88012B00D008BD0023C0F8A43200F060 +S31508004518B0F908BDFFF73AFEF5E708B50B7803F0DA +S315080045286003202B06D0402B04D043B1FFF72EFE9C +S31508004538002008BDD0F8B8329B68984708BD4B7864 +S31508004548092B21D8DFE803F0141C201820090520B8 +S31508004558100DFFF725FE002008BDFFF706FF00200F +S3150800456808BDFFF729FF08BDFFF78AFF002008BD29 +S31508004578FFF7A4FF002008BDFFF7EAFD002008BDE5 +S31508004588FFF7B8FF002008BDFFF700FE002008BDAA +S3150800459870B505460C460B7803F06003202B06D049 +S315080045A8402B04D01BB1FFF7F1FD00260CE095F867 +S315080045B89C32013B022B19D82379012B06D92146AF +S315080045C82846FFF7E3FD0026304670BDD5F8B83211 +S315080045D89B682146284698470646E388002BF3D168 +S315080045E80028F1D1284600F044F9EDE72146284687 +S315080045F8FFF7CCFD0026E7E738B505460C468A8856 +S315080046080B7803F06003202B08D0D1B2402B05D0D5 +S315080046185BB12146FFF7BAFD002038BDD5F8B83298 +S315080046289B6821462846984738BD6378012B30D0C1 +S31508004638002B5FD0032B40F0DC8090F89C32022BCD +S3150800464806D0032B15D02146FFF7A0FD002038BD5C +S31508004658002918BF802907D000F04DFC802128467C +S3150800466800F049FC002038BD2146FFF78FFD0020E1 +S3150800467838BD63882BB9002918BF802901D0E3887B +S3150800468823B1284600F0F5F8002038BD00F033FCC1 +S31508004698F7E790F89C32022B06D0032B15D0214653 +S315080046A8FFF774FD002038BD002918BF802907D0F8 +S315080046B800F021FC8021284600F01DFC002038BDAA +S315080046C82146FFF763FD002038BD6388002B40F0BC +S315080046D8958011F07F0F0AD1284600F0CAF8D5F858 +S315080046E8B8329B68214628469847002038BD00F00E +S315080046F80AFCF1E790F89C32022B06D0032B2BD044 +S315080047082146FFF743FD002038BD002918BF802938 +S3150800471813D112F0800F15D101F07F0101EB810149 +S315080047288B0003F5A8710144043100240C600222A9 +S31508004738284600F081F8204638BD2146FFF726FDB1 +S31508004748002038BD01F07F0101EB81018B0003F1E0 +S31508004758100101440431E8E752B2002A20DB01F0CF +S315080047680F0303EB830398002844B0F8643133B386 +S31508004778002A2ADB01F07F0202EB8202930003F586 +S31508004788A8742C440434802918BF002927D100238B +S31508004798236002222146284600F04EF8002038BD3C +S315080047A801F00F0303EB830398002844838C002B3E +S315080047B8DED121462846FFF7E9FC002038BD214608 +S315080047C82846FFF7E3FC002038BD01F07F0202EB1C +S315080047D88202930003F110042C440434D3E72846D4 +S315080047E800F038FB10B101232360D2E700232360C9 +S315080047F8CFE72146FFF7CAFC002038BD002038BDA0 +S31508004808C8B170B50D4616460446FFF797FC013041 +S3150800481840003080287003236B70022307E0EA54AF +S3150800482801345A1CD2B20021A9540233DBB22278C9 +S31508004838002AF4D170BD704710B513460222C0F895 +S3150800484894228361C3610A46002100F06CFB0020AC +S3150800485810BD08B513460A46002100F064FB00207F +S3150800486808BD08B513460A46002100F064FB002077 +S3150800487808BD08B50423C0F8943200231A46194619 +S3150800488800F051FB002008BD08B50523C0F894328E +S3150800489800231A46194600F04EFB002008BD000002 +S315080048A8054BD3F8882042F47002C3F888204FF0E5 +S315080048B800629A60704700BF00ED00E008B52F4A0D +S315080048C8136823F00F0343F007031360136803F014 +S315080048D80F03072B03D06A212948FCF753FA294BFB +S315080048E81A6842F440421A601A6842F480321A601A +S315080048F803F5E4331A6842F480221A601A6842F407 +S3150800490880321A60204B1B6813F4003FFAD01E4BFE +S315080049185A681E4911401E4A0A435A605A681D4970 +S3150800492811401D4A0A435A601A6842F080721A6092 +S31508004938154B1B6813F0007FFAD0134B9A6822F0C0 +S31508004948F0029A609A6822F4E05242F4A0529A60F9 +S315080049589A6822F4604242F400429A609A6822F001 +S31508004968030242F002029A60074B9B6803F00C03A5 +S31508004978082BF9D10948FFF757FA08BD003C024049 +S31508004988E451000800700040003802400080BCFF6F +S31508004998086C40000080BFF0086C400900E6DF0C90 +S315080049A808B5FCF785FDFFF789FF08BD08B5FFF7C9 +S315080049B8F7FFFCF735FAFCF741FAFCE72DE9F0436F +S315080049C891B04C4C636C43F480436364636C03F4A2 +S315080049D880430993099B236C43F080532364236C13 +S315080049E803F080530893089B236B43F00103236362 +S315080049F8236B03F001030793079B236B43F002031A +S31508004A082363236B03F002030693069B236B43F089 +S31508004A1804032363236B03F004030593059B236BA5 +S31508004A2843F008032363236B03F008030493049BEA +S31508004A38236C43F480232364236C03F480230393B1 +S31508004A48039B236C43F000732364236C03F0007301 +S31508004A580293029B80230A9301230B9300250C9546 +S31508004A680D950E95DFF89C800AA94046FEF7C4F80E +S31508004A784FF40003C8F818304FF400530A930B95FF +S31508004A880E950AA91C48FEF7B7F84FF44079CDF8F1 +S31508004A98289002270B9703260C960D950E95072343 +S31508004AA80F930AA91548FEF7A7F8CDF828900B978B +S31508004AB80C960D950E9509230F930AA94046FEF7FD +S31508004AC89BF84FF4C0530A930B970C960D950E95C1 +S31508004AD80A230F930AA90A48FEF78EF8636B43F070 +S31508004AE880036363636B03F080030193019B11B032 +S31508004AF8BDE8F0830038024000080240000C024076 +S31508004B08000002400004024010B5FEF70BF91B4CE2 +S31508004B184FF40003A3611A48FDF7B0FF1948FDF7DB +S31508004B28ADFF2046FDF7AAFF1748FDF7A7FF174B65 +S31508004B385A6B22F080025A631A6C22F000721A64C1 +S31508004B481A6C22F480221A641A6B22F008021A6375 +S31508004B581A6B22F004021A631A6B22F002021A630D +S31508004B681A6B22F001021A631A6C22F080521A6430 +S31508004B785A6C22F480425A6410BD00BF00040240F1 +S31508004B88000C0240000802400000024000380240BB +S31508004B98DFF834D0002103E00C4B5B58435004314E +S31508004BA80B480C4B42189A42F6D30B4A02E00023EC +S31508004BB842F8043B094B9A42F9D3FFF771FE00F015 +S31508004BC853FAFFF7F3FE7047000005204C52000819 +S31508004BD800000020C0000020C0000020701000203F +S31508004BE8FEE70000202303800048704744000020A1 +S31508004BF80A230380004870476400002008B590F827 +S31508004C089C32032B01D0002008BDFCF75BF8FAE7B5 +S31508004C1808B5FCF757F8002008BD08B50846FCF79C +S31508004C2885F8002008BD000008B50B7813F0600F5A +S31508004C3806D14B780A2B14D00B2B17D0062B01D08C +S31508004C48002008BD4B881B0A212B04D00B491722C4 +S31508004C58FFF7F2FDF4E7CA88172A28BF172208497A +S31508004C68F6E701220749FFF7E7FDE9E78B7813B965 +S31508004C78044A1360E4E7FFF789FAE1E74D000020E4 +S31508004C88560000200C0A002010B50446812100F0C1 +S31508004C982AF90121204600F026F9002010BD000057 +S31508004CA810B5044640230222812100F011F9402359 +S31508004CB802220121204600F00BF94023034A01216C +S31508004CC8204600F038F9002010BD00BF2C0A002045 +S31508004CD8004870472C0A002008B500F57171D0F80D +S31508004CE80004FFF709F908BD08B5C1EBC10293002E +S31508004CF80344D3F80822D0F80004FFF729F908BDB9 +S31508004D0808B5C1EBC102930003449A6CD0F80004B5 +S31508004D18FFF758F908BD08B5D0F80004FFF7EEF90B +S31508004D2808BD000010B50446C3683BB1022B0FD076 +S31508004D3891210848FCF726F8012100E00021D4F85B +S31508004D480004FFF7C4F9D4F80004FFF797F910BD73 +S31508004D580121F4E7F051000810B50446D0F800041C +S31508004D68FFF7B8F92268D2F8003E43F00103C2F803 +S31508004D78003E236A23B1044A136943F00603136104 +S31508004D88FCF722FB10BD00BF00ED00E010B5044695 +S31508004D98FCF71BFBD4F80004FFF7A5F910BD08B506 +S31508004DA8D0F80004FFF7BAF908BD08B5D0F800042A +S31508004DB8FFF7B2F908BD10B504460120FCF703FB56 +S31508004DC8D4F80004FFF7ACF910BD10B50446002066 +S31508004DD8FCF7F9FAD4F80004FFF7A4F910BD0000A7 +S31508004DE803780BB10020704710B503461748C0F87A +S31508004DF80034C3F8C4024FF0A04303600623436097 +S31508004E080222C2600023036182610122C261036231 +S31508004E184362C3620363FDF767F880B90B4C8021C8 +S31508004E282046FDF70AFE402200212046FDF7E1FD4F +S31508004E38802201212046FDF7DCFD002010BD40F246 +S31508004E4825110348FBF79EFFE8E700BF6C0A002018 +S31508004E58F0510008D0F8C43211F0800F08D101F0DB +S31508004E687F01C1EBC1018A00134493F8FE0170471C +S31508004E7801F07F01C1EBC1018A00134493F83E0093 +S31508004E88704708B5D0F8C402FDF708FD08BD18B183 +S31508004E98022803D003207047002070470120704776 +S31508004EA808B5D0F8C402FDF7EDF8FFF7F0FF08BD1E +S31508004EB808B5D0F8C402FDF7B0F8FFF7E8FF08BD53 +S31508004EC808B5D0F8C402FDF7BDF8FFF7E0FF08BD3E +S31508004ED810B51C4613462246D0F8C402FDF738FC1E +S31508004EE8FFF7D5FF10BD08B5D0F8C402FDF771FC69 +S31508004EF8FFF7CDFF08BD08B5D0F8C402FDF701FDD8 +S31508004F08FFF7C5FF08BD08B5D0F8C402FDF73AFD96 +S31508004F18FFF7BDFF08BD08B5D0F8C402FDF704FCC5 +S31508004F28FFF7B5FF08BD08B5D0F8C402FDF7BFFC02 +S31508004F38FFF7ADFF08BD08B5D0F8C402FDF780FC39 +S31508004F48FFF7A5FF08BD000012230B80004870472D +S31508004F588C00002004230B8000487047A00000201E +S31508004F680023934216D230B40BE0373401F81340C5 +S31508004F7800015C00013400250D550133DBB293426C +S31508004F8806D2040F092CF0D8303401F81340EFE79D +S31508004F9830BC70477047000038B50A4B18680433A8 +S31508004FA81C6804331B68C01800D138BD064D082292 +S31508004FB8A91CFFF7D5FF042205F112012046FFF7C1 +S31508004FC8CFFFF2E720F4F01FA400002008B51A2343 +S31508004FD80B80FFF7E1FF014808BD00BFA4000020C9 +S31508004FE808B50A4628B105490548FFF709FC0348E4 +S31508004FF808BD02490248FFF703FCF8E7700E0020CF +S315080050083052000810B5044C0A4621460348FFF7F3 +S31508005018F7FB204610BD00BF700E0020205200087E +S3150800502808B50A4628B105490548FFF7E9FB0348C4 +S3150800503808BD02490248FFF7E3FBF8E7700E0020AF +S315080050480052000808B50A4628B105490548FFF779 +S31508005058D7FB034808BD02490248FFF7D1FBF8E722 +S31508005068700E00200852000870B50D4E0D4CA41B92 +S31508005078A4100025A54209D10B4E0C4C00F018F8CF +S31508005088A41BA4100025A54205D170BD56F82530E5 +S3150800509898470135EEE756F8253098470135F2E77F +S315080050A8445200084452000844520008485200086E +S315080050B8F8B500BFF8BC08BC9E467047F8B500BFEF +S30D080050C8F8BC08BC9E467047BF +S315080050D02E2E5C2E2E5C2E2E5C2E2E5C536F757239 +S315080050E063655C41524D434D375F53544D333246E9 +S315080050F0375C63616E2E630005020602060307032A +S315080051000803090309040A040B040C040C050D051D +S315080051100E050F050F061006100710080080000878 +S315080051200080000001000000000001080080000067 +S315080051300200000000800108008000000300000053 +S315080051400000020800000200040000000000040835 +S315080051500000040005000000000008080000040024 +S315080051600600000000000C0800000400070000000C +S315080051702E2E5C2E2E5C2E2E5C2E2E5C536F757298 +S3150800518063655C41524D434D375F53544D33324648 +S31508005190375C72733233322E630000002E2E5C2E7B +S315080051A02E5C2E2E5C2E2E5C536F757263655C41E9 +S315080051B0524D434D375F53544D333246375C757302 +S315080051C0622E63004F70656E424C5400000000006A +S315080051D00000000001020304060708090000000099 +S315080051E0010203042E2E5C6D61696E2E63000000B9 +S315080051F02E2E5C757362645F636F6E662E630000A5 +S3150800520044656661756C740057696E555342204251 +S31508005210756C6B20496E7465726661636500000083 +S315080052204F70656E424C542055736572000000003D +S3150800523057696E5553422042756C6B2044657669F2 +S309080052406365000094 +S30908005244ED01000862 +S30908005248C901000882 +S3150800524C04010000100000000024F400A94C00081A +S3150800525C914C0008314C00080000000000000000CA +S3150800526C194C0008234C0008054C000800000000E7 +S3150800527C0000000000000000ED4B000800000000D4 +S3150800528CF94B000809022000010100C0320904008C +S3150800529C0002FF000000070581024000FF07050118 +S315080052AC024000FF0A060002000000400100000050 +S315080052BC514F00085D4F00080D500008E94F0008D3 +S315080052CCD54F0008295000084D500008120100025D +S315080052DC00000040501DAC600002010203010000F2 +S315080052EC040309041A030000000000000000000073 +S315080052FC0000000000000000000000000000000094 +S70508004B990E diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h index 5de6c6e1..2c47d3f0 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/CMSIS/Device/ST/STM32F7xx/Include/stm32f746xx.h @@ -12,29 +12,13 @@ ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h index 0633bb22..2650b739 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_pcd.h @@ -96,16 +96,16 @@ typedef struct __PCD_HandleTypeDef typedef struct #endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ { - PCD_TypeDef *Instance; /*!< Register base address */ - PCD_InitTypeDef Init; /*!< PCD required parameters */ - __IO uint8_t USB_Address; /*!< USB Address */ - PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ - PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ - HAL_LockTypeDef Lock; /*!< PCD peripheral status */ - __IO PCD_StateTypeDef State; /*!< PCD communication state */ - __IO uint32_t ErrorCode; /*!< PCD Error code */ - uint32_t Setup[12]; /*!< Setup packet buffer */ - PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ + PCD_TypeDef *Instance; /*!< Register base address */ + PCD_InitTypeDef Init; /*!< PCD required parameters */ + __IO uint8_t USB_Address; /*!< USB Address */ + PCD_EPTypeDef IN_ep[16]; /*!< IN endpoint parameters */ + PCD_EPTypeDef OUT_ep[16]; /*!< OUT endpoint parameters */ + HAL_LockTypeDef Lock; /*!< PCD peripheral status */ + __IO PCD_StateTypeDef State; /*!< PCD communication state */ + __IO uint32_t ErrorCode; /*!< PCD Error code */ + uint32_t Setup[12]; /*!< Setup packet buffer */ + PCD_LPM_StateTypeDef LPM_State; /*!< LPM State */ uint32_t BESL; @@ -148,9 +148,9 @@ typedef struct /** @defgroup PCD_Speed PCD Speed * @{ */ -#define PCD_SPEED_HIGH 0U -#define PCD_SPEED_HIGH_IN_FULL 1U -#define PCD_SPEED_FULL 2U +#define PCD_SPEED_HIGH USBD_HS_SPEED +#define PCD_SPEED_HIGH_IN_FULL USBD_HSINFS_SPEED +#define PCD_SPEED_FULL USBD_FS_SPEED /** * @} */ @@ -207,20 +207,20 @@ typedef struct #define __HAL_USB_OTG_HS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_HS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = (USB_OTG_HS_WAKEUP_EXTI_LINE) -#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_HS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_HS_WAKEUP_EXTI_LINE; \ } while(0U) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT() EXTI->IMR |= USB_OTG_FS_WAKEUP_EXTI_LINE #define __HAL_USB_OTG_FS_WAKEUP_EXTI_DISABLE_IT() EXTI->IMR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_GET_FLAG() EXTI->PR & (USB_OTG_FS_WAKEUP_EXTI_LINE) #define __HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG() EXTI->PR = USB_OTG_FS_WAKEUP_EXTI_LINE -#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ - do { \ +#define __HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE() \ + do { \ EXTI->FTSR &= ~(USB_OTG_FS_WAKEUP_EXTI_LINE); \ - EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ + EXTI->RTSR |= USB_OTG_FS_WAKEUP_EXTI_LINE; \ } while(0U) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -256,7 +256,7 @@ typedef enum HAL_PCD_SUSPEND_CB_ID = 0x04, /*!< USB PCD Suspend callback ID */ HAL_PCD_RESUME_CB_ID = 0x05, /*!< USB PCD Resume callback ID */ HAL_PCD_CONNECT_CB_ID = 0x06, /*!< USB PCD Connect callback ID */ - HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ + HAL_PCD_DISCONNECT_CB_ID = 0x07, /*!< USB PCD Disconnect callback ID */ HAL_PCD_MSPINIT_CB_ID = 0x08, /*!< USB PCD MspInit callback ID */ HAL_PCD_MSPDEINIT_CB_ID = 0x09 /*!< USB PCD MspDeInit callback ID */ @@ -371,14 +371,6 @@ PCD_StateTypeDef HAL_PCD_GetState(PCD_HandleTypeDef *hpcd); * @{ */ #if defined (USB_OTG_FS) || defined (USB_OTG_HS) -#define USB_OTG_FS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_FS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_FS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - -#define USB_OTG_HS_WAKEUP_EXTI_RISING_EDGE 0x08U -#define USB_OTG_HS_WAKEUP_EXTI_FALLING_EDGE 0x0CU -#define USB_OTG_HS_WAKEUP_EXTI_RISING_FALLING_EDGE 0x10U - #define USB_OTG_FS_WAKEUP_EXTI_LINE (0x1U << 18) /*!< USB FS EXTI Line WakeUp Interrupt */ #define USB_OTG_HS_WAKEUP_EXTI_LINE (0x1U << 20) /*!< USB HS EXTI Line WakeUp Interrupt */ #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h index f151a3d3..9bbccb71 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usart.h @@ -42,13 +42,6 @@ extern "C" { /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @defgroup USART_LL_Private_Constants USART Private Constants - * @{ - */ -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ #if defined(USE_FULL_LL_DRIVER) /** @defgroup USART_LL_Private_Macros USART Private Macros @@ -156,18 +149,21 @@ typedef struct */ #define LL_USART_ICR_PECF USART_ICR_PECF /*!< Parity error flag */ #define LL_USART_ICR_FECF USART_ICR_FECF /*!< Framing error flag */ -#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ +#define LL_USART_ICR_NCF USART_ICR_NCF /*!< Noise error detected flag */ #define LL_USART_ICR_ORECF USART_ICR_ORECF /*!< Overrun error flag */ #define LL_USART_ICR_IDLECF USART_ICR_IDLECF /*!< Idle line detected flag */ #define LL_USART_ICR_TCCF USART_ICR_TCCF /*!< Transmission complete flag */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ICR_TCBGTCF USART_ICR_TCBGTCF /*!< Transmission completed before guard time flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ #define LL_USART_ICR_LBDCF USART_ICR_LBDCF /*!< LIN break detection flag */ #define LL_USART_ICR_CTSCF USART_ICR_CTSCF /*!< CTS flag */ #define LL_USART_ICR_RTOCF USART_ICR_RTOCF /*!< Receiver timeout flag */ #define LL_USART_ICR_EOBCF USART_ICR_EOBCF /*!< End of block flag */ #define LL_USART_ICR_CMCF USART_ICR_CMCF /*!< Character match flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ICR_WUCF USART_ICR_WUCF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ /** * @} */ @@ -195,10 +191,16 @@ typedef struct #define LL_USART_ISR_CMF USART_ISR_CMF /*!< Character match flag */ #define LL_USART_ISR_SBKF USART_ISR_SBKF /*!< Send break flag */ #define LL_USART_ISR_RWU USART_ISR_RWU /*!< Receiver wakeup from Mute mode flag */ +#if defined(USART_CR1_UESM) +#define LL_USART_ISR_WUF USART_ISR_WUF /*!< Wakeup from Stop mode flag */ +#endif /* USART_CR1_UESM */ #define LL_USART_ISR_TEACK USART_ISR_TEACK /*!< Transmit enable acknowledge flag */ +#if defined(USART_ISR_REACK) +#define LL_USART_ISR_REACK USART_ISR_REACK /*!< Receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_ISR_TCBGT USART_ISR_TCBGT /*!< Transmission complete before guard time completion flag */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -218,9 +220,12 @@ typedef struct #define LL_USART_CR2_LBDIE USART_CR2_LBDIE /*!< LIN break detection interrupt enable */ #define LL_USART_CR3_EIE USART_CR3_EIE /*!< Error interrupt enable */ #define LL_USART_CR3_CTSIE USART_CR3_CTSIE /*!< CTS interrupt enable */ +#if defined(USART_CR1_UESM) +#define LL_USART_CR3_WUFIE USART_CR3_WUFIE /*!< Wakeup from Stop mode interrupt enable */ +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) #define LL_USART_CR3_TCBGTIE USART_CR3_TCBGTIE /*!< Transmission complete before guard time interrupt enable */ -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} */ @@ -400,6 +405,18 @@ typedef struct * @} */ +#if defined(USART_CR1_UESM) +/** @defgroup USART_LL_EC_WAKEUP_ON Wakeup Activation + * @{ + */ +#define LL_USART_WAKEUP_ON_ADDRESS 0x00000000U /*!< Wake up active on address match */ +#define LL_USART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< Wake up active on Start bit detection */ +#define LL_USART_WAKEUP_ON_RXNE (USART_CR3_WUS_0 | USART_CR3_WUS_1) /*!< Wake up active on RXNE */ +/** + * @} + */ + +#endif /* USART_CR1_UESM */ /** @defgroup USART_LL_EC_IRDA_POWER IrDA Power * @{ */ @@ -480,7 +497,8 @@ typedef struct * @param __BAUDRATE__ Baud rate value to achieve * @retval USARTDIV value to be used for BRR register filling in OverSampling_8 case */ -#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U) + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) +#define __LL_USART_DIV_SAMPLING8(__PERIPHCLK__, __BAUDRATE__) ((((__PERIPHCLK__)*2U)\ + + ((__BAUDRATE__)/2U))/(__BAUDRATE__)) /** * @brief Compute USARTDIV value according to Peripheral Clock and @@ -545,6 +563,87 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabled(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR1, USART_CR1_UE) == (USART_CR1_UE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief USART enabled in STOP Mode. + * @note When this function is enabled, USART is able to wake up the MCU from Stop mode, provided that + * USART clock selection is HSI or LSE in RCC. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_EnableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief USART disabled in STOP Mode. + * @note When this function is disabled, USART is not able to wake up the MCU from Stop mode + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_DisableInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR1, USART_CR1_UESM); +} + +/** + * @brief Indicate if USART is enabled in STOP Mode (able to wake up MCU from Stop mode or not) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR1 UESM LL_USART_IsEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledInStopMode(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR1, USART_CR1_UESM) == (USART_CR1_UESM)) ? 1UL : 0UL); +} + +#if defined(USART_CR3_UCESM) +/** + * @brief USART Clock enabled in STOP Mode + * @note When this function is called, USART Clock is enabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_EnableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableClockInStopMode(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief USART clock disabled in STOP Mode + * @note When this function is called, USART Clock is disabled while in STOP mode + * @rmtoll CR3 UCESM LL_USART_DisableClockInStopMode + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableClockInStopMode(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_UCESM); +} + +/** + * @brief Indicate if USART clock is enabled in STOP Mode + * @rmtoll CR3 UCESM LL_USART_IsClockEnabledInStopMode + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsClockEnabledInStopMode(USART_TypeDef *USARTx) +{ + return (READ_BIT(USARTx->CR3, USART_CR3_UCESM) == (USART_CR3_UCESM)); +} + +#endif /* USART_CR3_UCESM */ +#endif /* USART_CR1_UESM*/ /** * @brief Receiver Enable (Receiver is enabled and begins searching for a start bit) * @rmtoll CR1 RE LL_USART_EnableDirectionRx @@ -1461,6 +1560,41 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_OVRDIS) != USART_CR3_OVRDIS) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Select event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_SetWKUPType + * @param USARTx USART Instance + * @param Type This parameter can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + * @retval None + */ +__STATIC_INLINE void LL_USART_SetWKUPType(USART_TypeDef *USARTx, uint32_t Type) +{ + MODIFY_REG(USARTx->CR3, USART_CR3_WUS, Type); +} + +/** + * @brief Return event type for Wake UP Interrupt Flag (WUS[1:0] bits) + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUS LL_USART_GetWKUPType + * @param USARTx USART Instance + * @retval Returned value can be one of the following values: + * @arg @ref LL_USART_WAKEUP_ON_ADDRESS + * @arg @ref LL_USART_WAKEUP_ON_STARTBIT + * @arg @ref LL_USART_WAKEUP_ON_RXNE + */ +__STATIC_INLINE uint32_t LL_USART_GetWKUPType(USART_TypeDef *USARTx) +{ + return (uint32_t)(READ_BIT(USARTx->CR3, USART_CR3_WUS)); +} + +#endif /* USART_CR1_UESM */ /** * @brief Configure USART BRR register for achieving expected Baud Rate value. * @note Compute and set USARTDIV value in BRR Register (full BRR content) @@ -1480,7 +1614,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledOverrunDetect(USART_TypeDef *USARTx) __STATIC_INLINE void LL_USART_SetBaudRate(USART_TypeDef *USARTx, uint32_t PeriphClk, uint32_t OverSampling, uint32_t BaudRate) { - register uint32_t usartdiv; + uint32_t usartdiv; register uint32_t brrtemp; if (OverSampling == LL_USART_OVERSAMPLING_8) @@ -2161,7 +2295,8 @@ __STATIC_INLINE void LL_USART_ConfigAsyncMode(USART_TypeDef *USARTx) { /* In Asynchronous mode, the following bits must be kept cleared: - LINEN, CLKEN bits in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); } @@ -2197,7 +2332,8 @@ __STATIC_INLINE void LL_USART_ConfigSyncMode(USART_TypeDef *USARTx) { /* In Synchronous mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - SCEN, IREN and HDSEL bits in the USART_CR3 register.*/ + - SCEN, IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN | USART_CR3_HDSEL)); /* set the UART/USART in Synchronous mode */ @@ -2237,7 +2373,8 @@ __STATIC_INLINE void LL_USART_ConfigLINMode(USART_TypeDef *USARTx) { /* In LIN mode, the following bits must be kept cleared: - STOP and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_SCEN | USART_CR3_HDSEL)); /* Set the UART/USART in LIN mode */ @@ -2275,7 +2412,8 @@ __STATIC_INLINE void LL_USART_ConfigHalfDuplexMode(USART_TypeDef *USARTx) { /* In Half Duplex mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - SCEN and IREN bits in the USART_CR3 register.*/ + - SCEN and IREN bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_IREN)); /* set the UART/USART in Half Duplex mode */ @@ -2315,7 +2453,8 @@ __STATIC_INLINE void LL_USART_ConfigSmartcardMode(USART_TypeDef *USARTx) { /* In Smartcard mode, the following bits must be kept cleared: - LINEN bit in the USART_CR2 register, - - IREN and HDSEL bits in the USART_CR3 register.*/ + - IREN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_IREN | USART_CR3_HDSEL)); /* Configure Stop bits to 1.5 bits */ @@ -2358,7 +2497,8 @@ __STATIC_INLINE void LL_USART_ConfigIrdaMode(USART_TypeDef *USARTx) { /* In IRDA mode, the following bits must be kept cleared: - LINEN, STOP and CLKEN bits in the USART_CR2 register, - - SCEN and HDSEL bits in the USART_CR3 register.*/ + - SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN | USART_CR2_STOP)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL)); /* set the UART/USART in IRDA mode */ @@ -2396,7 +2536,8 @@ __STATIC_INLINE void LL_USART_ConfigMultiProcessMode(USART_TypeDef *USARTx) { /* In Multi Processor mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - - IREN, SCEN and HDSEL bits in the USART_CR3 register.*/ + - IREN, SCEN and HDSEL bits in the USART_CR3 register. + */ CLEAR_BIT(USARTx->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(USARTx->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); } @@ -2630,6 +2771,21 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_RWU(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_RWU) == (USART_ISR_RWU)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from stop mode Flag is set or not + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ISR WUF LL_USART_IsActiveFlag_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_WUF) == (USART_ISR_WUF)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ /** * @brief Check if the USART Transmit Enable Acknowledge Flag is set or not * @rmtoll ISR TEACK LL_USART_IsActiveFlag_TEACK @@ -2641,6 +2797,19 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TEACK(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->ISR, USART_ISR_TEACK) == (USART_ISR_TEACK)) ? 1UL : 0UL); } +#if defined(USART_ISR_REACK) +/** + * @brief Check if the USART Receive Enable Acknowledge Flag is set or not + * @rmtoll ISR REACK LL_USART_IsActiveFlag_REACK + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsActiveFlag_REACK(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->ISR, USART_ISR_REACK) == (USART_ISR_REACK)) ? 1UL : 0UL); +} + +#endif/* USART_ISR_REACK */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2653,8 +2822,8 @@ __STATIC_INLINE uint32_t LL_USART_IsActiveFlag_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->ISR, USART_ISR_TCBGT) == (USART_ISR_TCBGT)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear Parity Error Flag * @rmtoll ICR PECF LL_USART_ClearFlag_PE @@ -2733,7 +2902,7 @@ __STATIC_INLINE void LL_USART_ClearFlag_TCBGT(USART_TypeDef *USARTx) { WRITE_REG(USARTx->ICR, USART_ICR_TCBGTCF); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Clear LIN Break Detection Flag @@ -2796,6 +2965,21 @@ __STATIC_INLINE void LL_USART_ClearFlag_CM(USART_TypeDef *USARTx) WRITE_REG(USARTx->ICR, USART_ICR_CMCF); } +#if defined(USART_CR1_UESM) +/** + * @brief Clear Wake Up from stop mode Flag + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll ICR WUCF LL_USART_ClearFlag_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_ClearFlag_WKUP(USART_TypeDef *USARTx) +{ + WRITE_REG(USARTx->ICR, USART_ICR_WUCF); +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2935,6 +3119,21 @@ __STATIC_INLINE void LL_USART_EnableIT_CTS(USART_TypeDef *USARTx) SET_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Enable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_EnableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_EnableIT_WKUP(USART_TypeDef *USARTx) +{ + SET_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -2949,7 +3148,7 @@ __STATIC_INLINE void LL_USART_EnableIT_TCBGT(USART_TypeDef *USARTx) { SET_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Disable IDLE Interrupt @@ -3082,6 +3281,21 @@ __STATIC_INLINE void LL_USART_DisableIT_CTS(USART_TypeDef *USARTx) CLEAR_BIT(USARTx->CR3, USART_CR3_CTSIE); } +#if defined(USART_CR1_UESM) +/** + * @brief Disable Wake Up from Stop Mode Interrupt + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_DisableIT_WKUP + * @param USARTx USART Instance + * @retval None + */ +__STATIC_INLINE void LL_USART_DisableIT_WKUP(USART_TypeDef *USARTx) +{ + CLEAR_BIT(USARTx->CR3, USART_CR3_WUFIE); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3096,7 +3310,7 @@ __STATIC_INLINE void LL_USART_DisableIT_TCBGT(USART_TypeDef *USARTx) { CLEAR_BIT(USARTx->CR3, USART_CR3_TCBGTIE); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @brief Check if the USART IDLE Interrupt source is enabled or disabled. @@ -3225,6 +3439,21 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_CTS(USART_TypeDef *USARTx) return ((READ_BIT(USARTx->CR3, USART_CR3_CTSIE) == (USART_CR3_CTSIE)) ? 1UL : 0UL); } +#if defined(USART_CR1_UESM) +/** + * @brief Check if the USART Wake Up from Stop Mode Interrupt is enabled or disabled. + * @note Macro @ref IS_UART_WAKEUP_FROMSTOP_INSTANCE(USARTx) can be used to check whether or not + * Wake-up from Stop mode feature is supported by the USARTx instance. + * @rmtoll CR3 WUFIE LL_USART_IsEnabledIT_WKUP + * @param USARTx USART Instance + * @retval State of bit (1 or 0). + */ +__STATIC_INLINE uint32_t LL_USART_IsEnabledIT_WKUP(USART_TypeDef *USARTx) +{ + return ((READ_BIT(USARTx->CR3, USART_CR3_WUFIE) == (USART_CR3_WUFIE)) ? 1UL : 0UL); +} + +#endif /* USART_CR1_UESM */ #if defined(USART_TCBGT_SUPPORT) /* Function available only on devices supporting Transmit Complete before Guard Time feature */ /** @@ -3239,7 +3468,7 @@ __STATIC_INLINE uint32_t LL_USART_IsEnabledIT_TCBGT(USART_TypeDef *USARTx) { return ((READ_BIT(USARTx->CR3, USART_CR3_TCBGTIE) == (USART_CR3_TCBGTIE)) ? 1UL : 0UL); } -#endif +#endif /* USART_TCBGT_SUPPORT */ /** * @} @@ -3365,12 +3594,12 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t if (Direction == LL_USART_DMA_REG_DATA_TRANSMIT) { /* return address of TDR register */ - data_reg_addr = (uint32_t) & (USARTx->TDR); + data_reg_addr = (uint32_t) &(USARTx->TDR); } else { /* return address of RDR register */ - data_reg_addr = (uint32_t) & (USARTx->RDR); + data_reg_addr = (uint32_t) &(USARTx->RDR); } return data_reg_addr; @@ -3392,7 +3621,7 @@ __STATIC_INLINE uint32_t LL_USART_DMA_GetRegAddr(USART_TypeDef *USARTx, uint32_t */ __STATIC_INLINE uint8_t LL_USART_ReceiveData8(USART_TypeDef *USARTx) { - return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR)); + return (uint8_t)(READ_BIT(USARTx->RDR, USART_RDR_RDR) & 0xFFU); } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h index 1f768abf..44bf4853 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_ll_usb.h @@ -155,7 +155,7 @@ typedef struct typedef struct { - uint8_t dev_addr ; /*!< USB device address. + uint8_t dev_addr; /*!< USB device address. This parameter must be a number between Min_Data = 1 and Max_Data = 255 */ uint8_t ch_num; /*!< Host channel number. @@ -199,10 +199,10 @@ typedef struct uint32_t ErrCnt; /*!< Host channel error count.*/ - USB_OTG_URBStateTypeDef urb_state; /*!< URB state. + USB_OTG_URBStateTypeDef urb_state; /*!< URB state. This parameter can be any value of @ref USB_OTG_URBStateTypeDef */ - USB_OTG_HCStateTypeDef state; /*!< Host Channel state. + USB_OTG_HCStateTypeDef state; /*!< Host Channel state. This parameter can be any value of @ref USB_OTG_HCStateTypeDef */ } USB_OTG_HCTypeDef; #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ @@ -234,6 +234,18 @@ typedef struct * @} */ +/** @defgroup USB_LL Device Speed + * @{ + */ +#define USBD_HS_SPEED 0U +#define USBD_HSINFS_SPEED 1U +#define USBH_HS_SPEED 0U +#define USBD_FS_SPEED 2U +#define USBH_FSLS_SPEED 1U +/** + * @} + */ + /** @defgroup USB_LL_Core_Speed USB Low Layer Core Speed * @{ */ @@ -252,7 +264,7 @@ typedef struct #define USB_OTG_HS_EMBEDDED_PHY 3U #if !defined (USB_HS_PHYC_TUNE_VALUE) -#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ +#define USB_HS_PHYC_TUNE_VALUE 0x00000F13U /*!< Value of USB HS PHY Tune */ #endif /* USB_HS_PHYC_TUNE_VALUE */ /** * @} @@ -262,11 +274,11 @@ typedef struct * @{ */ #ifndef USBD_HS_TRDT_VALUE -#define USBD_HS_TRDT_VALUE 9U +#define USBD_HS_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ #ifndef USBD_FS_TRDT_VALUE -#define USBD_FS_TRDT_VALUE 5U -#define USBD_DEFAULT_TRDT_VALUE 9U +#define USBD_FS_TRDT_VALUE 5U +#define USBD_DEFAULT_TRDT_VALUE 9U #endif /* USBD_HS_TRDT_VALUE */ /** * @} @@ -275,9 +287,9 @@ typedef struct /** @defgroup USB_LL_Core_MPS USB Low Layer Core MPS * @{ */ -#define USB_OTG_HS_MAX_PACKET_SIZE 512U -#define USB_OTG_FS_MAX_PACKET_SIZE 64U -#define USB_OTG_MAX_EP0_SIZE 64U +#define USB_OTG_HS_MAX_PACKET_SIZE 512U +#define USB_OTG_FS_MAX_PACKET_SIZE 64U +#define USB_OTG_MAX_EP0_SIZE 64U /** * @} */ @@ -287,7 +299,6 @@ typedef struct */ #define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ (0U << 1) #define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ (1U << 1) -#define DSTS_ENUMSPD_LS_PHY_6MHZ (2U << 1) #define DSTS_ENUMSPD_FS_PHY_48MHZ (3U << 1) /** * @} @@ -397,7 +408,7 @@ typedef struct #define USBPHYC ((USBPHYC_GlobalTypeDef *)((uint32_t )USB_PHY_HS_CONTROLLER_BASE)) #endif /* defined (USB_OTG_FS) || defined (USB_OTG_HS) */ -#define EP_ADDR_MSK 0xFU +#define EP_ADDR_MSK 0xFU /** * @} */ @@ -462,13 +473,9 @@ HAL_StatusTypeDef USB_ResetPort(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state); uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx); uint32_t USB_GetCurrentFrame(USB_OTG_GlobalTypeDef *USBx); -HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, - uint8_t ch_num, - uint8_t epnum, - uint8_t dev_address, - uint8_t speed, - uint8_t ep_type, - uint16_t mps); +HAL_StatusTypeDef USB_HC_Init(USB_OTG_GlobalTypeDef *USBx, uint8_t ch_num, + uint8_t epnum, uint8_t dev_address, uint8_t speed, + uint8_t ep_type, uint16_t mps); HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDef *hc, uint8_t dma); uint32_t USB_HC_ReadInterrupt(USB_OTG_GlobalTypeDef *USBx); HAL_StatusTypeDef USB_HC_Halt(USB_OTG_GlobalTypeDef *USBx, uint8_t hc_num); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c index 2b4a5eff..ea532df6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_pcd.c @@ -122,6 +122,7 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint */ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) { + USB_OTG_GlobalTypeDef *USBx; uint8_t i; /* Check the PCD handle allocation */ @@ -133,6 +134,8 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) /* Check the parameters */ assert_param(IS_PCD_ALL_INSTANCE(hpcd->Instance)); + USBx = hpcd->Instance; + if (hpcd->State == HAL_PCD_STATE_RESET) { /* Allocate lock resource and initialize it */ @@ -166,6 +169,12 @@ HAL_StatusTypeDef HAL_PCD_Init(PCD_HandleTypeDef *hpcd) hpcd->State = HAL_PCD_STATE_BUSY; + /* Disable DMA mode for FS instance */ + if ((USBx->CID & (0x1U << 8)) == 0U) + { + hpcd->Init.dma_enable = 0U; + } + /* Disable the Interrupts */ __HAL_PCD_DISABLE(hpcd); @@ -943,7 +952,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USB_OTG_GlobalTypeDef *USBx = hpcd->Instance; uint32_t USBx_BASE = (uint32_t)USBx; - uint32_t i, ep_intr, epint, epnum = 0U; + uint32_t i, ep_intr, epint, epnum; uint32_t fifoemptymsk, temp; USB_OTG_EPTypeDef *ep; @@ -962,6 +971,38 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_MMIS); } + /* Handle RxQLevel Interrupt */ + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) + { + USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + + temp = USBx->GRXSTSP; + + ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; + + if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) + { + if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) + { + (void)USB_ReadPacket(USBx, ep->xfer_buff, + (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); + + ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + } + else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) + { + (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); + ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; + } + else + { + /* ... */ + } + USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); + } + if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_OEPINT)) { epnum = 0U; @@ -983,9 +1024,9 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if ((epint & USB_OTG_DOEPINT_STUP) == USB_OTG_DOEPINT_STUP) { + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); /* Class B setup phase done for previous decoded setup */ (void)PCD_EP_OutSetupPacket_int(hpcd, epnum); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } if ((epint & USB_OTG_DOEPINT_OTEPDIS) == USB_OTG_DOEPINT_OTEPDIS) @@ -996,10 +1037,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Clear Status Phase Received interrupt */ if ((epint & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) { - if (hpcd->Init.dma_enable == 1U) - { - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - } CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_OTEPSPR); } @@ -1037,16 +1074,7 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) if (hpcd->Init.dma_enable == 1U) { hpcd->IN_ep[epnum].xfer_buff += hpcd->IN_ep[epnum].maxpacket; - } -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - if (hpcd->Init.dma_enable == 1U) - { /* this is ZLP, so prepare EP0 for next setup */ if ((epnum == 0U) && (hpcd->IN_ep[epnum].xfer_len == 0U)) { @@ -1054,6 +1082,12 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } } + +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataInStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataInStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } if ((epint & USB_OTG_DIEPINT_TOC) == USB_OTG_DIEPINT_TOC) { @@ -1159,8 +1193,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) { USBx_INEP(i)->DIEPINT = 0xFB7FU; USBx_INEP(i)->DIEPCTL &= ~USB_OTG_DIEPCTL_STALL; + USBx_INEP(i)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; USBx_OUTEP(i)->DOEPINT = 0xFB7FU; USBx_OUTEP(i)->DOEPCTL &= ~USB_OTG_DOEPCTL_STALL; + USBx_OUTEP(i)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; } USBx_DEVICE->DAINTMSK |= 0x10001U; @@ -1217,38 +1253,6 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) __HAL_PCD_CLEAR_FLAG(hpcd, USB_OTG_GINTSTS_ENUMDNE); } - /* Handle RxQLevel Interrupt */ - if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_RXFLVL)) - { - USB_MASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - - temp = USBx->GRXSTSP; - - ep = &hpcd->OUT_ep[temp & USB_OTG_GRXSTSP_EPNUM]; - - if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_DATA_UPDT) - { - if ((temp & USB_OTG_GRXSTSP_BCNT) != 0U) - { - (void)USB_ReadPacket(USBx, ep->xfer_buff, - (uint16_t)((temp & USB_OTG_GRXSTSP_BCNT) >> 4)); - - ep->xfer_buff += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - } - else if (((temp & USB_OTG_GRXSTSP_PKTSTS) >> 17) == STS_SETUP_UPDT) - { - (void)USB_ReadPacket(USBx, (uint8_t *)hpcd->Setup, 8U); - ep->xfer_count += (temp & USB_OTG_GRXSTSP_BCNT) >> 4; - } - else - { - /* ... */ - } - USB_UNMASK_INTERRUPT(hpcd->Instance, USB_OTG_GINTSTS_RXFLVL); - } - /* Handle SOF Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_SOF)) { @@ -1264,6 +1268,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO IN Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_IISOIXFR)) { + /* Keep application checking the corresponding Iso IN endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOINIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1276,6 +1284,10 @@ void HAL_PCD_IRQHandler(PCD_HandleTypeDef *hpcd) /* Handle Incomplete ISO OUT Interrupt */ if (__HAL_PCD_GET_FLAG(hpcd, USB_OTG_GINTSTS_PXFR_INCOMPISOOUT)) { + /* Keep application checking the corresponding Iso OUT endpoint + causing the incomplete Interrupt */ + epnum = 0U; + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->ISOOUTIncompleteCallback(hpcd, (uint8_t)epnum); #else @@ -1955,16 +1967,6 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint { CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } - - /* Inform the upper layer that a setup packet is available */ -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->SetupStageCallback(hpcd); -#else - HAL_PCD_SetupStageCallback(hpcd); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - - (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STUP); } else if ((DoepintReg & USB_OTG_DOEPINT_OTEPSPR) == USB_OTG_DOEPINT_OTEPSPR) /* Class E */ { @@ -1987,17 +1989,16 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint hpcd->OUT_ep[epnum].xfer_buff += hpcd->OUT_ep[epnum].maxpacket; -#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) - hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); -#else - HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); -#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ - if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) { /* this is ZLP, so prepare EP0 for next setup */ (void)USB_EP0_OutStart(hpcd->Instance, 1U, (uint8_t *)hpcd->Setup); } +#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) + hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); +#else + HAL_PCD_DataOutStageCallback(hpcd, (uint8_t)epnum); +#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */ } } else @@ -2030,6 +2031,12 @@ static HAL_StatusTypeDef PCD_EP_OutXfrComplete_int(PCD_HandleTypeDef *hpcd, uint } else { + if ((epnum == 0U) && (hpcd->OUT_ep[epnum].xfer_len == 0U)) + { + /* this is ZLP, so prepare EP0 for next setup */ + (void)USB_EP0_OutStart(hpcd->Instance, 0U, (uint8_t *)hpcd->Setup); + } + #if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U) hpcd->DataOutStageCallback(hpcd, (uint8_t)epnum); #else @@ -2055,22 +2062,10 @@ static HAL_StatusTypeDef PCD_EP_OutSetupPacket_int(PCD_HandleTypeDef *hpcd, uint uint32_t gSNPSiD = *(__IO uint32_t *)(&USBx->CID + 0x1U); uint32_t DoepintReg = USBx_OUTEP(epnum)->DOEPINT; - if (hpcd->Init.dma_enable == 1U) + if ((gSNPSiD > USB_OTG_CORE_ID_300A) && + ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) { - /* StupPktRcvd = 1 pending setup packet int */ - if ((gSNPSiD > USB_OTG_CORE_ID_300A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } - } - else - { - if ((gSNPSiD == USB_OTG_CORE_ID_310A) && - ((DoepintReg & USB_OTG_DOEPINT_STPKTRX) == USB_OTG_DOEPINT_STPKTRX)) - { - CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); - } + CLEAR_OUT_EP_INTR(epnum, USB_OTG_DOEPINT_STPKTRX); } /* Inform the upper layer that a setup packet is available */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c index 987e5bef..0f04752c 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_gpio.c @@ -220,9 +220,6 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru if (currentpin) { - /* Pin Mode configuration */ - LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) { /* Check Speed mode parameters */ @@ -230,6 +227,12 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru /* Speed mode configuration */ LL_GPIO_SetPinSpeed(GPIOx, currentpin, GPIO_InitStruct->Speed); + + /* Check Output mode parameters */ + assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); + + /* Output mode configuration*/ + LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); } /* Pull-up Pull down resistor configuration*/ @@ -250,19 +253,11 @@ ErrorStatus LL_GPIO_Init(GPIO_TypeDef *GPIOx, LL_GPIO_InitTypeDef *GPIO_InitStru LL_GPIO_SetAFPin_8_15(GPIOx, currentpin, GPIO_InitStruct->Alternate); } } + /* Pin Mode configuration */ + LL_GPIO_SetPinMode(GPIOx, currentpin, GPIO_InitStruct->Mode); } pinpos++; } - - if ((GPIO_InitStruct->Mode == LL_GPIO_MODE_OUTPUT) || (GPIO_InitStruct->Mode == LL_GPIO_MODE_ALTERNATE)) - { - /* Check Output mode parameters */ - assert_param(IS_LL_GPIO_OUTPUT_TYPE(GPIO_InitStruct->OutputType)); - - /* Output mode configuration*/ - LL_GPIO_SetPinOutputType(GPIOx, GPIO_InitStruct->Pin, GPIO_InitStruct->OutputType); - - } return (SUCCESS); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c index 0197818f..588d0bb5 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_rcc.c @@ -163,7 +163,7 @@ uint32_t RCC_PLLI2S_GetFreqDomain_SPDIFRX(void); */ ErrorStatus LL_RCC_DeInit(void) { - uint32_t vl_mask = 0xFFFFFFFFU; + __IO uint32_t vl_mask; /* Set HSION bit */ LL_RCC_HSI_Enable(); @@ -175,10 +175,13 @@ ErrorStatus LL_RCC_DeInit(void) /* Reset CFGR register */ LL_RCC_WriteReg(CFGR, 0x00000000U); + /* Read CR register */ + vl_mask = LL_RCC_ReadReg(CR); + /* Reset HSEON, HSEBYP, PLLON, CSSON, PLLI2SON and PLLSAION bits */ CLEAR_BIT(vl_mask, (RCC_CR_HSEON | RCC_CR_HSEBYP | RCC_CR_PLLON | RCC_CR_CSSON | RCC_CR_PLLSAION | RCC_CR_PLLI2SON)); - /* Write new mask in CR register */ + /* Write new value in CR register */ LL_RCC_WriteReg(CR, vl_mask); /* Set HSITRIM bits to the reset value*/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c index 2f82ef49..b3db0e6a 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usart.c @@ -22,11 +22,11 @@ #include "stm32f7xx_ll_usart.h" #include "stm32f7xx_ll_rcc.h" #include "stm32f7xx_ll_bus.h" -#ifdef USE_FULL_ASSERT +#ifdef USE_FULL_ASSERT #include "stm32_assert.h" #else #define assert_param(expr) ((void)0U) -#endif +#endif /* USE_FULL_ASSERT */ /** @addtogroup STM32F7xx_LL_Driver * @{ @@ -41,14 +41,6 @@ /* Private types -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private constants ---------------------------------------------------------*/ -/** @addtogroup USART_LL_Private_Constants - * @{ - */ - -/** - * @} - */ - /* Private macros ------------------------------------------------------------*/ /** @addtogroup USART_LL_Private_Macros * @{ @@ -65,42 +57,42 @@ #define IS_LL_USART_BRR_MAX(__VALUE__) ((__VALUE__) <= 0x0000FFFFU) #define IS_LL_USART_DIRECTION(__VALUE__) (((__VALUE__) == LL_USART_DIRECTION_NONE) \ - || ((__VALUE__) == LL_USART_DIRECTION_RX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX) \ - || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) + || ((__VALUE__) == LL_USART_DIRECTION_RX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX) \ + || ((__VALUE__) == LL_USART_DIRECTION_TX_RX)) #define IS_LL_USART_PARITY(__VALUE__) (((__VALUE__) == LL_USART_PARITY_NONE) \ - || ((__VALUE__) == LL_USART_PARITY_EVEN) \ - || ((__VALUE__) == LL_USART_PARITY_ODD)) + || ((__VALUE__) == LL_USART_PARITY_EVEN) \ + || ((__VALUE__) == LL_USART_PARITY_ODD)) #define IS_LL_USART_DATAWIDTH(__VALUE__) (((__VALUE__) == LL_USART_DATAWIDTH_7B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ - || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) + || ((__VALUE__) == LL_USART_DATAWIDTH_8B) \ + || ((__VALUE__) == LL_USART_DATAWIDTH_9B)) #define IS_LL_USART_OVERSAMPLING(__VALUE__) (((__VALUE__) == LL_USART_OVERSAMPLING_16) \ - || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) + || ((__VALUE__) == LL_USART_OVERSAMPLING_8)) #define IS_LL_USART_LASTBITCLKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_LASTCLKPULSE_NO_OUTPUT) \ - || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) + || ((__VALUE__) == LL_USART_LASTCLKPULSE_OUTPUT)) #define IS_LL_USART_CLOCKPHASE(__VALUE__) (((__VALUE__) == LL_USART_PHASE_1EDGE) \ - || ((__VALUE__) == LL_USART_PHASE_2EDGE)) + || ((__VALUE__) == LL_USART_PHASE_2EDGE)) #define IS_LL_USART_CLOCKPOLARITY(__VALUE__) (((__VALUE__) == LL_USART_POLARITY_LOW) \ - || ((__VALUE__) == LL_USART_POLARITY_HIGH)) + || ((__VALUE__) == LL_USART_POLARITY_HIGH)) #define IS_LL_USART_CLOCKOUTPUT(__VALUE__) (((__VALUE__) == LL_USART_CLOCK_DISABLE) \ - || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) + || ((__VALUE__) == LL_USART_CLOCK_ENABLE)) #define IS_LL_USART_STOPBITS(__VALUE__) (((__VALUE__) == LL_USART_STOPBITS_0_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_1) \ - || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ - || ((__VALUE__) == LL_USART_STOPBITS_2)) + || ((__VALUE__) == LL_USART_STOPBITS_1) \ + || ((__VALUE__) == LL_USART_STOPBITS_1_5) \ + || ((__VALUE__) == LL_USART_STOPBITS_2)) #define IS_LL_USART_HWCONTROL(__VALUE__) (((__VALUE__) == LL_USART_HWCONTROL_NONE) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ - || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) + || ((__VALUE__) == LL_USART_HWCONTROL_RTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_CTS) \ + || ((__VALUE__) == LL_USART_HWCONTROL_RTS_CTS)) /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c index ece23086..8d9dbb24 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_ll_usb.c @@ -94,6 +94,11 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c /* Init The ULPI Interface */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_TSDPS | USB_OTG_GUSBCFG_ULPIFSLS | USB_OTG_GUSBCFG_PHYSEL); +#if defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) + /* Select ULPI Interface */ + USBx->GUSBCFG |= USB_OTG_GUSBCFG_ULPI_UTMI_SEL; +#endif /* defined(STM32F722xx) || defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F732xx) || defined(STM32F733xx) */ + /* Select vbus source */ USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); if (cfg.use_external_vbus == 1U) @@ -115,7 +120,7 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c USBx->GUSBCFG &= ~(USB_OTG_GUSBCFG_ULPIEVBUSD | USB_OTG_GUSBCFG_ULPIEVBUSI); /* Select UTMI Interace */ - USBx->GUSBCFG &= ~ USB_OTG_GUSBCFG_ULPI_UTMI_SEL; + USBx->GUSBCFG &= ~USB_OTG_GUSBCFG_ULPI_UTMI_SEL; USBx->GCCFG |= USB_OTG_GCCFG_PHYHSEN; /* Enables control of a High Speed USB PHY */ @@ -158,10 +163,6 @@ HAL_StatusTypeDef USB_CoreInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c * @brief Set the USB turnaround time * @param USBx USB Instance * @param hclk: AHB clock frequency - * @param speed device speed - * This parameter can be one of these values: - * @arg PCD_SPEED_HIGH: High speed mode - * @arg PCD_SPEED_FULL: Full speed mode * @retval USB turnaround time In PHY Clocks number */ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, @@ -173,7 +174,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, used by application. In the low AHB frequency range it is used to stretch enough the USB response time to IN tokens, the USB turnaround time, so to compensate for the longer AHB read access latency to the Data FIFO */ - if (speed == PCD_SPEED_FULL) + if (speed == USBD_FS_SPEED) { if ((hclk >= 14200000U) && (hclk < 15000000U)) { @@ -226,7 +227,7 @@ HAL_StatusTypeDef USB_SetTurnaroundTime(USB_OTG_GlobalTypeDef *USBx, UsbTrd = 0x6U; } } - else if (speed == PCD_SPEED_HIGH) + else if (speed == USBD_HS_SPEED) { UsbTrd = USBD_HS_TRDT_VALUE; } @@ -318,6 +319,8 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf /* VBUS Sensing setup */ if (cfg.vbus_sensing_enable == 0U) { + USBx_DEVICE->DCTL |= USB_OTG_DCTL_SDIS; + /* Deactivate VBUS Sensing B */ USBx->GCCFG &= ~USB_OTG_GCCFG_VBDEN; @@ -339,33 +342,33 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf if (cfg.phy_itface == USB_OTG_ULPI_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else if (cfg.phy_itface == USB_OTG_HS_EMBEDDED_PHY) { - if (cfg.speed == USB_OTG_SPEED_HIGH) + if (cfg.speed == USBD_HS_SPEED) { - /* Set High speed phy */ + /* Set Core speed to High speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH); } else { - /* set High speed phy in Full speed mode */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_HIGH_IN_FULL); } } else { - /* Set Full speed phy */ + /* Set Core speed to Full speed mode */ (void)USB_SetDevSpeed(USBx, USB_OTG_SPEED_FULL); } @@ -431,17 +434,6 @@ HAL_StatusTypeDef USB_DevInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef cf USBx_DEVICE->DIEPMSK &= ~(USB_OTG_DIEPMSK_TXFURM); - if (cfg.dma_enable == 1U) - { - /*Set threshold parameters */ - USBx_DEVICE->DTHRCTL = USB_OTG_DTHRCTL_TXTHRLEN_6 | - USB_OTG_DTHRCTL_RXTHRLEN_6; - - USBx_DEVICE->DTHRCTL |= USB_OTG_DTHRCTL_RXTHREN | - USB_OTG_DTHRCTL_ISOTHREN | - USB_OTG_DTHRCTL_NONISOTHREN; - } - /* Disable all interrupts. */ USBx->GINTMSK = 0U; @@ -557,16 +549,16 @@ uint8_t USB_GetDevSpeed(USB_OTG_GlobalTypeDef *USBx) if (DevEnumSpeed == DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ) { - speed = PCD_SPEED_HIGH; + speed = USBD_HS_SPEED; } else if ((DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ) || (DevEnumSpeed == DSTS_ENUMSPD_FS_PHY_48MHZ)) { - speed = PCD_SPEED_FULL; + speed = USBD_FS_SPEED; } else { - speed = 0U; + speed = 0xFU; } return speed; @@ -663,6 +655,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); USBx_INEP(epnum)->DIEPCTL &= ~(USB_OTG_DIEPCTL_USBAEP | @@ -673,6 +671,12 @@ HAL_StatusTypeDef USB_DeactivateEndpoint(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EP } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_DEVICE->DEACHMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); USBx_OUTEP(epnum)->DOEPCTL &= ~(USB_OTG_DOEPCTL_USBAEP | @@ -698,11 +702,23 @@ HAL_StatusTypeDef USB_DeactivateDedicatedEndpoint(USB_OTG_GlobalTypeDef *USBx, U /* Read DEPCTLn register */ if (ep->is_in == 1U) { + if ((USBx_INEP(epnum)->DIEPCTL & USB_OTG_DIEPCTL_EPENA) == USB_OTG_DIEPCTL_EPENA) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SNAK; + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_EPDIS; + } + USBx_INEP(epnum)->DIEPCTL &= ~ USB_OTG_DIEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_IEPM & (uint32_t)(1UL << (ep->num & EP_ADDR_MSK))); } else { + if ((USBx_OUTEP(epnum)->DOEPCTL & USB_OTG_DOEPCTL_EPENA) == USB_OTG_DOEPCTL_EPENA) + { + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_SNAK; + USBx_OUTEP(epnum)->DOEPCTL |= USB_OTG_DOEPCTL_EPDIS; + } + USBx_OUTEP(epnum)->DOEPCTL &= ~USB_OTG_DOEPCTL_USBAEP; USBx_DEVICE->DAINTMSK &= ~(USB_OTG_DAINTMSK_OEPM & ((uint32_t)(1UL << (ep->num & EP_ADDR_MSK)) << 16)); } @@ -761,9 +777,27 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + if (ep->type == EP_TYPE_ISOC) + { + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + if (ep->type != EP_TYPE_ISOC) { /* Enable the Tx FIFO Empty Interrupt for this EP */ @@ -772,27 +806,20 @@ HAL_StatusTypeDef USB_EPStartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDef USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - } - - if (ep->type == EP_TYPE_ISOC) - { - if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) - { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; - } else { - USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + if ((USBx_DEVICE->DSTS & (1U << 8)) == 0U) + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SODDFRM; + } + else + { + USBx_INEP(epnum)->DIEPCTL |= USB_OTG_DIEPCTL_SD0PID_SEVNFRM; + } + + (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); - - if (ep->type == EP_TYPE_ISOC) - { - (void)USB_WritePacket(USBx, ep->xfer_buff, ep->num, (uint16_t)ep->xfer_len, dma); - } } else /* OUT endpoint */ { @@ -890,18 +917,21 @@ HAL_StatusTypeDef USB_EP0StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_EPTypeDe { USBx_INEP(epnum)->DIEPDMA = (uint32_t)(ep->dma_addr); } + + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else { + /* EP enable, IN data in FIFO */ + USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); + /* Enable the Tx FIFO Empty Interrupt for this EP */ if (ep->xfer_len > 0U) { USBx_DEVICE->DIEPEMPMSK |= 1UL << (ep->num & EP_ADDR_MSK); } } - - /* EP enable, IN data in FIFO */ - USBx_INEP(epnum)->DIEPCTL |= (USB_OTG_DIEPCTL_CNAK | USB_OTG_DIEPCTL_EPENA); } else /* OUT endpoint */ { @@ -959,7 +989,7 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin count32b = ((uint32_t)len + 3U) / 4U; for (i = 0U; i < count32b; i++) { - USBx_DFIFO((uint32_t)ch_ep_num) = *((__packed uint32_t *)pSrc); + USBx_DFIFO((uint32_t)ch_ep_num) = __UNALIGNED_UINT32_READ(pSrc); pSrc++; } } @@ -968,15 +998,10 @@ HAL_StatusTypeDef USB_WritePacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *src, uin } /** - * @brief USB_ReadPacket : read a packet from the Tx FIFO associated - * with the EP/channel + * @brief USB_ReadPacket : read a packet from the RX FIFO * @param USBx Selected device * @param dest source pointer * @param len Number of bytes to read - * @param dma USB dma enabled or disabled - * This parameter can be one of these values: - * 0 : DMA feature not used - * 1 : DMA feature used * @retval pointer to destination buffer */ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) @@ -988,7 +1013,7 @@ void *USB_ReadPacket(USB_OTG_GlobalTypeDef *USBx, uint8_t *dest, uint16_t len) for (i = 0U; i < count32b; i++) { - *(__packed uint32_t *)pDest = USBx_DFIFO(0U); + __UNALIGNED_UINT32_WRITE(pDest, USBx_DFIFO(0U)); pDest++; } @@ -1260,13 +1285,9 @@ HAL_StatusTypeDef USB_ActivateSetup(USB_OTG_GlobalTypeDef *USBx) { uint32_t USBx_BASE = (uint32_t)USBx; - /* Set the MPS of the IN EP based on the enumeration speed */ + /* Set the MPS of the IN EP0 to 64 bytes */ USBx_INEP(0U)->DIEPCTL &= ~USB_OTG_DIEPCTL_MPSIZ; - if ((USBx_DEVICE->DSTS & USB_OTG_DSTS_ENUMSPD) == DSTS_ENUMSPD_LS_PHY_6MHZ) - { - USBx_INEP(0U)->DIEPCTL |= 3U; - } USBx_DEVICE->DCTL |= USB_OTG_DCTL_CGINAK; return HAL_OK; @@ -1433,7 +1454,7 @@ HAL_StatusTypeDef USB_HostInit(USB_OTG_GlobalTypeDef *USBx, USB_OTG_CfgTypeDef c if ((USBx->CID & (0x1U << 8)) != 0U) { - if (cfg.speed == USB_OTG_SPEED_FULL) + if (cfg.speed == USBH_FSLS_SPEED) { /* Force Device Enumeration to FS/LS mode only */ USBx_HOST->HCFG |= USB_OTG_HCFG_FSLSS; @@ -1594,9 +1615,9 @@ HAL_StatusTypeDef USB_DriveVbus(USB_OTG_GlobalTypeDef *USBx, uint8_t state) * @param USBx Selected device * @retval speed : Host speed * This parameter can be one of these values: - * @arg USB_OTG_SPEED_HIGH: High speed mode - * @arg USB_OTG_SPEED_FULL: Full speed mode - * @arg USB_OTG_SPEED_LOW: Low speed mode + * @arg HCD_SPEED_HIGH: High speed mode + * @arg HCD_SPEED_FULL: Full speed mode + * @arg HCD_SPEED_LOW: Low speed mode */ uint32_t USB_GetHostSpeed(USB_OTG_GlobalTypeDef *USBx) { @@ -1774,7 +1795,7 @@ HAL_StatusTypeDef USB_HC_StartXfer(USB_OTG_GlobalTypeDef *USBx, USB_OTG_HCTypeDe uint16_t num_packets; uint16_t max_hc_pkt_count = 256U; - if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USB_OTG_SPEED_HIGH)) + if (((USBx->CID & (0x1U << 8)) != 0U) && (hc->speed == USBH_HS_SPEED)) { if ((dma == 0U) && (hc->do_ping == 1U)) { @@ -2002,7 +2023,6 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) uint32_t value; uint32_t i; - (void)USB_DisableGlobalInt(USBx); /* Flush FIFO */ @@ -2041,6 +2061,7 @@ HAL_StatusTypeDef USB_StopHost(USB_OTG_GlobalTypeDef *USBx) /* Clear any pending Host interrupts */ USBx_HOST->HAINT = 0xFFFFFFFFU; USBx->GINTSTS = 0xFFFFFFFFU; + (void)USB_EnableGlobalInt(USBx); return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h index 31ec3b02..988ba1ff 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_core.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_CORE_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -84,58 +84,55 @@ */ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id); USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass); -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx); USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup); -USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev , uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata); -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed); +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev); USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum); -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev); /* USBD Low Level Driver */ -USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_DeInit (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_Stop (USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_OpenEP (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t ep_type, - uint16_t ep_mps); +USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_DeInit(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Start(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_LL_Stop(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_LL_CloseEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_FlushEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_StallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_ClearStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -uint8_t USBD_LL_IsStallEP (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -USBD_StatusTypeDef USBD_LL_SetUSBAddress (USBD_HandleTypeDef *pdev, uint8_t dev_addr); -USBD_StatusTypeDef USBD_LL_Transmit (USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t ep_type, uint16_t ep_mps); -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, - uint8_t ep_addr, - uint8_t *pbuf, - uint16_t size); +USBD_StatusTypeDef USBD_LL_CloseEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_FlushEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_StallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_ClearStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_addr); -uint32_t USBD_LL_GetRxDataSize (USBD_HandleTypeDef *pdev, uint8_t ep_addr); -void USBD_LL_Delay (uint32_t Delay); +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, + uint8_t *pbuf, uint32_t size); + +uint8_t USBD_LL_IsStallEP(USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_LL_GetRxDataSize(USBD_HandleTypeDef *pdev, uint8_t ep_addr); + +void USBD_LL_Delay(uint32_t Delay); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h index 9fa2873a..a4bfc44b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ctlreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USB_REQUEST_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -73,16 +73,14 @@ * @{ */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata); +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); -void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); - -void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); - -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h index b1e7968d..8219140f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_def.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_DEF_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -61,9 +61,13 @@ #define USBD_SELF_POWERED 1U #endif /*USBD_SELF_POWERED */ -#ifndef USBD_SUPPORT_USER_STRING -#define USBD_SUPPORT_USER_STRING 0U -#endif /* USBD_SUPPORT_USER_STRING */ +#ifndef USBD_SUPPORT_USER_STRING_DESC +#define USBD_SUPPORT_USER_STRING_DESC 0U +#endif /* USBD_SUPPORT_USER_STRING_DESC */ + +#ifndef USBD_CLASS_USER_STRING_DESC +#define USBD_CLASS_USER_STRING_DESC 0U +#endif /* USBD_CLASS_USER_STRING_DESC */ #define USB_LEN_DEV_QUALIFIER_DESC 0x0AU #define USB_LEN_DEV_DESC 0x12U @@ -158,37 +162,58 @@ typedef struct usb_setup_req { + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USBD_SetupReqTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t wDescriptorLengthLow; + uint8_t wDescriptorLengthHigh; + uint8_t bNumInterfaces; + uint8_t bConfigurationValue; + uint8_t iConfiguration; + uint8_t bmAttributes; + uint8_t bMaxPower; +} USBD_ConfigDescTypedef; + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint16_t wTotalLength; + uint8_t bNumDeviceCaps; +} USBD_BosDescTypedef; - uint8_t bmRequest; - uint8_t bRequest; - uint16_t wValue; - uint16_t wIndex; - uint16_t wLength; -}USBD_SetupReqTypedef; struct _USBD_HandleTypeDef; typedef struct _Device_cb { - uint8_t (*Init) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - uint8_t (*DeInit) (struct _USBD_HandleTypeDef *pdev , uint8_t cfgidx); - /* Control Endpoints*/ - uint8_t (*Setup) (struct _USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req); - uint8_t (*EP0_TxSent) (struct _USBD_HandleTypeDef *pdev ); - uint8_t (*EP0_RxReady) (struct _USBD_HandleTypeDef *pdev ); + uint8_t (*Init)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + uint8_t (*DeInit)(struct _USBD_HandleTypeDef *pdev, uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup)(struct _USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); + uint8_t (*EP0_TxSent)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*EP0_RxReady)(struct _USBD_HandleTypeDef *pdev); /* Class Specific Endpoints*/ - uint8_t (*DataIn) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*DataOut) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*SOF) (struct _USBD_HandleTypeDef *pdev); - uint8_t (*IsoINIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); - uint8_t (*IsoOUTIncomplete) (struct _USBD_HandleTypeDef *pdev , uint8_t epnum); + uint8_t (*DataIn)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*DataOut)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*SOF)(struct _USBD_HandleTypeDef *pdev); + uint8_t (*IsoINIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); + uint8_t (*IsoOUTIncomplete)(struct _USBD_HandleTypeDef *pdev, uint8_t epnum); uint8_t *(*GetHSConfigDescriptor)(uint16_t *length); uint8_t *(*GetFSConfigDescriptor)(uint16_t *length); uint8_t *(*GetOtherSpeedConfigDescriptor)(uint16_t *length); uint8_t *(*GetDeviceQualifierDescriptor)(uint16_t *length); -#if (USBD_SUPPORT_USER_STRING == 1U) - uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev ,uint8_t index, uint16_t *length); +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + uint8_t *(*GetUsrStrDescriptor)(struct _USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); #endif } USBD_ClassTypeDef; @@ -199,38 +224,44 @@ typedef enum USBD_SPEED_HIGH = 0U, USBD_SPEED_FULL = 1U, USBD_SPEED_LOW = 2U, -}USBD_SpeedTypeDef; +} USBD_SpeedTypeDef; /* Following USB Device status */ -typedef enum { - USBD_OK = 0U, +typedef enum +{ + USBD_OK = 0U, USBD_BUSY, + USBD_EMEM, USBD_FAIL, -}USBD_StatusTypeDef; +} USBD_StatusTypeDef; /* USB Device descriptors structure */ typedef struct { - uint8_t *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); - uint8_t *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); -#if (USBD_LPM_ENABLED == 1U) - uint8_t *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); + uint8_t *(*GetDeviceDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetProductStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); +#if (USBD_CLASS_USER_STRING_DESC == 1) + uint8_t *(*GetUserStrDescriptor)(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); +#endif +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1)) + uint8_t *(*GetBOSDescriptor)(USBD_SpeedTypeDef speed, uint16_t *length); #endif } USBD_DescriptorsTypeDef; /* USB Device handle structure */ typedef struct { - uint32_t status; - uint32_t is_used; - uint32_t total_length; - uint32_t rem_length; - uint32_t maxpacket; + uint32_t status; + uint32_t total_length; + uint32_t rem_length; + uint32_t maxpacket; + uint16_t is_used; + uint16_t bInterval; } USBD_EndpointTypeDef; /* USB Device handle structure */ @@ -241,8 +272,8 @@ typedef struct _USBD_HandleTypeDef uint32_t dev_default_config; uint32_t dev_config_status; USBD_SpeedTypeDef dev_speed; - USBD_EndpointTypeDef ep_in[15]; - USBD_EndpointTypeDef ep_out[15]; + USBD_EndpointTypeDef ep_in[16]; + USBD_EndpointTypeDef ep_out[16]; uint32_t ep0_state; uint32_t ep0_data_len; uint8_t dev_state; @@ -251,6 +282,7 @@ typedef struct _USBD_HandleTypeDef uint8_t dev_connection_status; uint8_t dev_test_mode; uint32_t dev_remote_wakeup; + uint8_t ConfIdx; USBD_SetupReqTypedef request; USBD_DescriptorsTypeDef *pDesc; @@ -258,6 +290,8 @@ typedef struct _USBD_HandleTypeDef void *pClassData; void *pUserData; void *pData; + void *pBosDesc; + void *pConfDesc; } USBD_HandleTypeDef; /** @@ -269,40 +303,57 @@ typedef struct _USBD_HandleTypeDef /** @defgroup USBD_DEF_Exported_Macros * @{ */ -#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ - (((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) +__STATIC_INLINE uint16_t SWAPBYTE(uint8_t *addr) +{ + uint16_t _SwapVal, _Byte1, _Byte2; + uint8_t *_pbuff = addr; -#define LOBYTE(x) ((uint8_t)(x & 0x00FFU)) -#define HIBYTE(x) ((uint8_t)((x & 0xFF00U) >> 8U)) + _Byte1 = *(uint8_t *)_pbuff; + _pbuff++; + _Byte2 = *(uint8_t *)_pbuff; + + _SwapVal = (_Byte2 << 8) | _Byte1; + + return _SwapVal; +} + +#define LOBYTE(x) ((uint8_t)((x) & 0x00FFU)) +#define HIBYTE(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) > (b)) ? (a) : (b)) #if defined ( __GNUC__ ) - #ifndef __weak - #define __weak __attribute__((weak)) - #endif /* __weak */ - #ifndef __packed - #define __packed __attribute__((__packed__)) - #endif /* __packed */ +#ifndef __weak +#define __weak __attribute__((weak)) +#endif /* __weak */ +#ifndef __packed +#define __packed __attribute__((__packed__)) +#endif /* __packed */ #endif /* __GNUC__ */ /* In HS mode and when the DMA is used, all variables and data structures dealing with the DMA during the transaction process should be 4-bytes aligned */ -#if defined (__GNUC__) /* GNU Compiler */ - #define __ALIGN_END __attribute__ ((aligned (4))) - #define __ALIGN_BEGIN +#if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */ +#ifndef __ALIGN_END +#define __ALIGN_END __attribute__ ((aligned (4U))) +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#define __ALIGN_BEGIN +#endif /* __ALIGN_BEGIN */ #else - #define __ALIGN_END - #if defined (__CC_ARM) /* ARM Compiler */ - #define __ALIGN_BEGIN __align(4) - #elif defined (__ICCARM__) /* IAR Compiler */ - #define __ALIGN_BEGIN - #elif defined (__TASKING__) /* TASKING Compiler */ - #define __ALIGN_BEGIN __align(4) - #endif /* __CC_ARM */ +#ifndef __ALIGN_END +#define __ALIGN_END +#endif /* __ALIGN_END */ +#ifndef __ALIGN_BEGIN +#if defined (__CC_ARM) /* ARM Compiler */ +#define __ALIGN_BEGIN __align(4U) +#elif defined (__ICCARM__) /* IAR Compiler */ +#define __ALIGN_BEGIN +#endif /* __CC_ARM */ +#endif /* __ALIGN_BEGIN */ #endif /* __GNUC__ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h index 0552e00f..8f077c79 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Inc/usbd_ioreq.h @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -22,7 +22,7 @@ #define __USBD_IOREQ_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* Includes ------------------------------------------------------------------*/ @@ -77,27 +77,22 @@ * @{ */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, - uint16_t len); +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len); -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev); +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev); -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev); - -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr); +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr); /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c index 1cc9b19f..e3db03fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_core.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -33,6 +33,7 @@ /** @defgroup USBD_CORE_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -50,13 +51,12 @@ /** @defgroup USBD_CORE_Private_Macros * @{ */ + /** * @} */ - - /** @defgroup USBD_CORE_Private_FunctionPrototypes * @{ */ @@ -73,6 +73,7 @@ * @} */ + /** @defgroup USBD_CORE_Private_Functions * @{ */ @@ -85,10 +86,13 @@ * @param id: Low level core index * @retval None */ -USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef *pdesc, uint8_t id) +USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, + USBD_DescriptorsTypeDef *pdesc, uint8_t id) { + USBD_StatusTypeDef ret; + /* Check whether the USB Host handle is valid */ - if(pdev == NULL) + if (pdev == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Device handle"); @@ -96,25 +100,31 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * return USBD_FAIL; } - /* Unlink previous class*/ - if(pdev->pClass != NULL) + /* Unlink previous class */ + if (pdev->pClass != NULL) { pdev->pClass = NULL; } + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + /* Assign USBD Descriptors */ - if(pdesc != NULL) + if (pdesc != NULL) { pdev->pDesc = pdesc; } /* Set Device initial State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; pdev->id = id; - /* Initialize low level driver */ - USBD_LL_Init(pdev); - return USBD_OK; + /* Initialize low level driver */ + ret = USBD_LL_Init(pdev); + + return ret; } /** @@ -125,19 +135,34 @@ USBD_StatusTypeDef USBD_Init(USBD_HandleTypeDef *pdev, USBD_DescriptorsTypeDef * */ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Set Default State */ - pdev->dev_state = USBD_STATE_DEFAULT; + pdev->dev_state = USBD_STATE_DEFAULT; /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } + + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + if (ret != USBD_OK) + { + return ret; + } /* Initialize low level driver */ - USBD_LL_DeInit(pdev); + ret = USBD_LL_DeInit(pdev); - return USBD_OK; + return ret; } /** @@ -147,24 +172,30 @@ USBD_StatusTypeDef USBD_DeInit(USBD_HandleTypeDef *pdev) * @param pclass: Class handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) +USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeDef *pclass) { - USBD_StatusTypeDef status = USBD_OK; - if(pclass != 0) - { - /* link the class to the USB Device handle */ - pdev->pClass = pclass; - status = USBD_OK; - } - else + uint16_t len = 0U; + + if (pclass == NULL) { #if (USBD_DEBUG_LEVEL > 1U) USBD_ErrLog("Invalid Class handle"); #endif - status = USBD_FAIL; + return USBD_FAIL; } - return status; + /* link the class to the USB Device handle */ + pdev->pClass = pclass; + + /* Get Device Configuration Descriptor */ +#ifdef USE_USB_FS + pdev->pConfDesc = (void *)pdev->pClass->GetFSConfigDescriptor(&len); +#else /* USE_USB_HS */ + pdev->pConfDesc = (void *)pdev->pClass->GetHSConfigDescriptor(&len); +#endif /* USE_USB_FS */ + + + return USBD_OK; } /** @@ -173,13 +204,10 @@ USBD_StatusTypeDef USBD_RegisterClass(USBD_HandleTypeDef *pdev, USBD_ClassTypeD * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Start(USBD_HandleTypeDef *pdev) { - /* Start the low level driver */ - USBD_LL_Start(pdev); - - return USBD_OK; + return USBD_LL_Start(pdev); } /** @@ -188,15 +216,25 @@ USBD_StatusTypeDef USBD_Start (USBD_HandleTypeDef *pdev) * @param pdev: Device Handle * @retval USBD Status */ -USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_Stop(USBD_HandleTypeDef *pdev) { + USBD_StatusTypeDef ret; + /* Free Class Resources */ - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } - /* Stop the low level driver */ - USBD_LL_Stop(pdev); + if (pdev->pConfDesc != NULL) + { + pdev->pConfDesc = NULL; + } - return USBD_OK; + /* Stop the low level driver */ + ret = USBD_LL_Stop(pdev); + + return ret; } /** @@ -205,7 +243,7 @@ USBD_StatusTypeDef USBD_Stop (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_RunTestMode(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -221,17 +259,14 @@ USBD_StatusTypeDef USBD_RunTestMode (USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - USBD_StatusTypeDef ret = USBD_FAIL; + USBD_StatusTypeDef ret = USBD_FAIL; - if(pdev->pClass != NULL) + if (pdev->pClass != NULL) { - /* Set configuration and Start the Class*/ - if(pdev->pClass->Init(pdev, cfgidx) == 0U) - { - ret = USBD_OK; - } + /* Set configuration and Start the Class */ + ret = (USBD_StatusTypeDef)pdev->pClass->Init(pdev, cfgidx); } return ret; @@ -244,10 +279,14 @@ USBD_StatusTypeDef USBD_SetClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx * @param cfgidx: configuration index * @retval status: USBD_StatusTypeDef */ -USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) +USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx) { - /* Clear configuration and De-initialize the Class process*/ - pdev->pClass->DeInit(pdev, cfgidx); + /* Clear configuration and De-initialize the Class process */ + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, cfgidx); + } + return USBD_OK; } @@ -260,6 +299,8 @@ USBD_StatusTypeDef USBD_ClrClassConfig(USBD_HandleTypeDef *pdev, uint8_t cfgidx */ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) { + USBD_StatusTypeDef ret; + USBD_ParseSetupRequest(&pdev->request, psetup); pdev->ep0_state = USBD_EP0_SETUP; @@ -268,24 +309,24 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) switch (pdev->request.bmRequest & 0x1FU) { - case USB_REQ_RECIPIENT_DEVICE: - USBD_StdDevReq (pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_DEVICE: + ret = USBD_StdDevReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_INTERFACE: - USBD_StdItfReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_INTERFACE: + ret = USBD_StdItfReq(pdev, &pdev->request); + break; - case USB_REQ_RECIPIENT_ENDPOINT: - USBD_StdEPReq(pdev, &pdev->request); - break; + case USB_REQ_RECIPIENT_ENDPOINT: + ret = USBD_StdEPReq(pdev, &pdev->request); + break; - default: - USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); - break; + default: + ret = USBD_LL_StallEP(pdev, (pdev->request.bmRequest & 0x80U)); + break; } - return USBD_OK; + return ret; } /** @@ -298,48 +339,54 @@ USBD_StatusTypeDef USBD_LL_SetupStage(USBD_HandleTypeDef *pdev, uint8_t *psetup) USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, uint8_t epnum, uint8_t *pdata) { - USBD_EndpointTypeDef *pep; + USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_out[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_OUT) + if (pdev->ep0_state == USBD_EP0_DATA_OUT) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { - pep->rem_length -= pep->maxpacket; + pep->rem_length -= pep->maxpacket; - USBD_CtlContinueRx (pdev, - pdata, - (uint16_t)MIN(pep->rem_length, pep->maxpacket)); + (void)USBD_CtlContinueRx(pdev, pdata, MIN(pep->rem_length, pep->maxpacket)); } else { - if((pdev->pClass->EP0_RxReady != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_RxReady != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_RxReady(pdev); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else { +#if 0 if (pdev->ep0_state == USBD_EP0_STATUS_OUT) { /* * STATUS PHASE completed, update ep0_state to idle */ pdev->ep0_state = USBD_EP0_IDLE; - USBD_LL_StallEP(pdev, 0U); + (void)USBD_LL_StallEP(pdev, 0U); } +#endif } } - else if((pdev->pClass->DataOut != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataOut != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataOut(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataOut(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -357,69 +404,78 @@ USBD_StatusTypeDef USBD_LL_DataOutStage(USBD_HandleTypeDef *pdev, * @param epnum: endpoint index * @retval status */ -USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, - uint8_t *pdata) +USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, + uint8_t epnum, uint8_t *pdata) { USBD_EndpointTypeDef *pep; + USBD_StatusTypeDef ret; - if(epnum == 0U) + if (epnum == 0U) { pep = &pdev->ep_in[0]; - if ( pdev->ep0_state == USBD_EP0_DATA_IN) + if (pdev->ep0_state == USBD_EP0_DATA_IN) { - if(pep->rem_length > pep->maxpacket) + if (pep->rem_length > pep->maxpacket) { pep->rem_length -= pep->maxpacket; - USBD_CtlContinueSendData (pdev, pdata, (uint16_t)pep->rem_length); + (void)USBD_CtlContinueSendData(pdev, pdata, pep->rem_length); /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else - { /* last packet is MPS multiple, so send ZLP packet */ - if((pep->total_length % pep->maxpacket == 0U) && - (pep->total_length >= pep->maxpacket) && - (pep->total_length < pdev->ep0_data_len)) + { + /* last packet is MPS multiple, so send ZLP packet */ + if ((pep->maxpacket == pep->rem_length) && + (pep->total_length >= pep->maxpacket) && + (pep->total_length < pdev->ep0_data_len)) { - USBD_CtlContinueSendData(pdev, NULL, 0U); + (void)USBD_CtlContinueSendData(pdev, NULL, 0U); pdev->ep0_data_len = 0U; /* Prepare endpoint for premature end of transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); } else { - if((pdev->pClass->EP0_TxSent != NULL)&& - (pdev->dev_state == USBD_STATE_CONFIGURED)) + if ((pdev->pClass->EP0_TxSent != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { pdev->pClass->EP0_TxSent(pdev); } - USBD_LL_StallEP(pdev, 0x80U); - USBD_CtlReceiveStatus(pdev); + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_CtlReceiveStatus(pdev); } } } else { +#if 0 if ((pdev->ep0_state == USBD_EP0_STATUS_IN) || (pdev->ep0_state == USBD_EP0_IDLE)) { - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0x80U); } +#endif } if (pdev->dev_test_mode == 1U) { - USBD_RunTestMode(pdev); + (void)USBD_RunTestMode(pdev); pdev->dev_test_mode = 0U; } } - else if((pdev->pClass->DataIn != NULL) && - (pdev->dev_state == USBD_STATE_CONFIGURED)) + else if ((pdev->pClass->DataIn != NULL) && + (pdev->dev_state == USBD_STATE_CONFIGURED)) { - pdev->pClass->DataIn(pdev, epnum); + ret = (USBD_StatusTypeDef)pdev->pClass->DataIn(pdev, epnum); + + if (ret != USBD_OK) + { + return ret; + } } else { @@ -437,29 +493,30 @@ USBD_StatusTypeDef USBD_LL_DataInStage(USBD_HandleTypeDef *pdev, uint8_t epnum, * @retval status */ -USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) { - /* Open EP0 OUT */ - USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + /* Upon Reset call user call back */ + pdev->dev_state = USBD_STATE_DEFAULT; + pdev->ep0_state = USBD_EP0_IDLE; + pdev->dev_config = 0U; + pdev->dev_remote_wakeup = 0U; + + if (pdev->pClassData != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } + + /* Open EP0 OUT */ + (void)USBD_LL_OpenEP(pdev, 0x00U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_out[0x00U & 0xFU].is_used = 1U; pdev->ep_out[0].maxpacket = USB_MAX_EP0_SIZE; /* Open EP0 IN */ - USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); + (void)USBD_LL_OpenEP(pdev, 0x80U, USBD_EP_TYPE_CTRL, USB_MAX_EP0_SIZE); pdev->ep_in[0x80U & 0xFU].is_used = 1U; pdev->ep_in[0].maxpacket = USB_MAX_EP0_SIZE; - /* Upon Reset call user call back */ - pdev->dev_state = USBD_STATE_DEFAULT; - pdev->ep0_state = USBD_EP0_IDLE; - pdev->dev_config= 0U; - pdev->dev_remote_wakeup = 0U; - - if (pdev->pClassData) - { - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); - } return USBD_OK; } @@ -470,9 +527,11 @@ USBD_StatusTypeDef USBD_LL_Reset(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef speed) +USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, + USBD_SpeedTypeDef speed) { pdev->dev_speed = speed; + return USBD_OK; } @@ -483,10 +542,11 @@ USBD_StatusTypeDef USBD_LL_SetSpeed(USBD_HandleTypeDef *pdev, USBD_SpeedTypeDef * @retval status */ -USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) { - pdev->dev_old_state = pdev->dev_state; - pdev->dev_state = USBD_STATE_SUSPENDED; + pdev->dev_old_state = pdev->dev_state; + pdev->dev_state = USBD_STATE_SUSPENDED; + return USBD_OK; } @@ -497,9 +557,13 @@ USBD_StatusTypeDef USBD_LL_Suspend(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) { - pdev->dev_state = pdev->dev_old_state; + if (pdev->dev_state == USBD_STATE_SUSPENDED) + { + pdev->dev_state = pdev->dev_old_state; + } + return USBD_OK; } @@ -510,15 +574,16 @@ USBD_StatusTypeDef USBD_LL_Resume(USBD_HandleTypeDef *pdev) * @retval status */ -USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) { - if(pdev->dev_state == USBD_STATE_CONFIGURED) + if (pdev->dev_state == USBD_STATE_CONFIGURED) { - if(pdev->pClass->SOF != NULL) + if (pdev->pClass->SOF != NULL) { pdev->pClass->SOF(pdev); } } + return USBD_OK; } @@ -528,7 +593,8 @@ USBD_StatusTypeDef USBD_LL_SOF(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -543,7 +609,8 @@ USBD_StatusTypeDef USBD_LL_IsoINIncomplete(USBD_HandleTypeDef *pdev, uint8_t ep * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t epnum) +USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, + uint8_t epnum) { /* Prevent unused arguments compilation warning */ UNUSED(pdev); @@ -558,7 +625,7 @@ USBD_StatusTypeDef USBD_LL_IsoOUTIncomplete(USBD_HandleTypeDef *pdev, uint8_t e * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) { /* Prevent unused argument compilation warning */ UNUSED(pdev); @@ -572,11 +639,15 @@ USBD_StatusTypeDef USBD_LL_DevConnected(USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_LL_DevDisconnected(USBD_HandleTypeDef *pdev) { /* Free Class Resources */ pdev->dev_state = USBD_STATE_DEFAULT; - pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + + if (pdev->pClass != NULL) + { + pdev->pClass->DeInit(pdev, (uint8_t)pdev->dev_config); + } return USBD_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c index c3e7ecbe..c51f3497 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -35,6 +35,7 @@ /** @defgroup USBD_REQ_Private_TypesDefinitions * @{ */ + /** * @} */ @@ -52,6 +53,7 @@ /** @defgroup USBD_REQ_Private_Macros * @{ */ + /** * @} */ @@ -60,6 +62,7 @@ /** @defgroup USBD_REQ_Private_Variables * @{ */ + /** * @} */ @@ -68,27 +71,13 @@ /** @defgroup USBD_REQ_Private_FunctionPrototypes * @{ */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetConfig(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_GetStatus(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req); - +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); static uint8_t USBD_GetLen(uint8_t *buf); /** @@ -108,7 +97,7 @@ static uint8_t USBD_GetLen(uint8_t *buf); * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdDevReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -116,41 +105,38 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType { case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup(pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - switch (req->bRequest) { case USB_REQ_GET_DESCRIPTOR: - - USBD_GetDescriptor (pdev, req); + USBD_GetDescriptor(pdev, req); break; case USB_REQ_SET_ADDRESS: - USBD_SetAddress (pdev, req); + USBD_SetAddress(pdev, req); break; case USB_REQ_SET_CONFIGURATION: - USBD_SetConfig (pdev, req); + ret = USBD_SetConfig(pdev, req); break; case USB_REQ_GET_CONFIGURATION: - USBD_GetConfig (pdev, req); + USBD_GetConfig(pdev, req); break; case USB_REQ_GET_STATUS: - USBD_GetStatus (pdev, req); + USBD_GetStatus(pdev, req); break; - case USB_REQ_SET_FEATURE: - USBD_SetFeature (pdev, req); + USBD_SetFeature(pdev, req); break; case USB_REQ_CLEAR_FEATURE: - USBD_ClrFeature (pdev, req); + USBD_ClrFeature(pdev, req); break; default: @@ -174,7 +160,7 @@ USBD_StatusTypeDef USBD_StdDevReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdItfReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { USBD_StatusTypeDef ret = USBD_OK; @@ -191,11 +177,11 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType if (LOBYTE(req->wIndex) <= USBD_MAX_NUM_INTERFACES) { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); if ((req->wLength == 0U) && (ret == USBD_OK)) { - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } } else @@ -215,7 +201,7 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType break; } - return USBD_OK; + return ret; } /** @@ -225,43 +211,31 @@ USBD_StatusTypeDef USBD_StdItfReq (USBD_HandleTypeDef *pdev , USBD_SetupReqType * @param req: usb request * @retval status */ -USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTypedef *req) +USBD_StatusTypeDef USBD_StdEPReq(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - - uint8_t ep_addr; + USBD_EndpointTypeDef *pep; + uint8_t ep_addr; USBD_StatusTypeDef ret = USBD_OK; - USBD_EndpointTypeDef *pep; - ep_addr = LOBYTE(req->wIndex); + ep_addr = LOBYTE(req->wIndex); switch (req->bmRequest & USB_REQ_TYPE_MASK) { - case USB_REQ_TYPE_CLASS: case USB_REQ_TYPE_VENDOR: - pdev->pClass->Setup (pdev, req); + ret = (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); break; case USB_REQ_TYPE_STANDARD: - /* Check if it is a class request */ - if ((req->bmRequest & 0x60U) == 0x20U) - { - ret = (USBD_StatusTypeDef)pdev->pClass->Setup (pdev, req); - - return ret; - } - switch (req->bRequest) { - - case USB_REQ_SET_FEATURE : - + case USB_REQ_SET_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -274,10 +248,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr != 0x00U) && (ep_addr != 0x80U) && (req->wLength == 0x00U)) { - USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, ep_addr); } } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); break; @@ -287,15 +261,15 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } break; - case USB_REQ_CLEAR_FEATURE : + case USB_REQ_CLEAR_FEATURE: switch (pdev->dev_state) { case USBD_STATE_ADDRESSED: if ((ep_addr != 0x00U) && (ep_addr != 0x80U)) { - USBD_LL_StallEP(pdev, ep_addr); - USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, ep_addr); + (void)USBD_LL_StallEP(pdev, 0x80U); } else { @@ -308,9 +282,10 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped { if ((ep_addr & 0x7FU) != 0x00U) { - USBD_LL_ClearStallEP(pdev, ep_addr); + (void)USBD_LL_ClearStallEP(pdev, ep_addr); } - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); + (USBD_StatusTypeDef)pdev->pClass->Setup(pdev, req); } break; @@ -329,16 +304,16 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped USBD_CtlError(pdev, req); break; } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; - pep->status = 0x0000U; + pep->status = 0x0000U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); - break; + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); + break; case USBD_STATE_CONFIGURED: - if((ep_addr & 0x80U) == 0x80U) + if ((ep_addr & 0x80U) == 0x80U) { if (pdev->ep_in[ep_addr & 0xFU].is_used == 0U) { @@ -355,14 +330,14 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped } } - pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU]:\ - &pdev->ep_out[ep_addr & 0x7FU]; + pep = ((ep_addr & 0x80U) == 0x80U) ? &pdev->ep_in[ep_addr & 0x7FU] : \ + &pdev->ep_out[ep_addr & 0x7FU]; if ((ep_addr == 0x00U) || (ep_addr == 0x80U)) { pep->status = 0x0000U; } - else if(USBD_LL_IsStallEP(pdev, ep_addr)) + else if (USBD_LL_IsStallEP(pdev, ep_addr) != 0U) { pep->status = 0x0001U; } @@ -371,7 +346,7 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped pep->status = 0x0000U; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pep->status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pep->status, 2U); break; default: @@ -393,6 +368,8 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped return ret; } + + /** * @brief USBD_GetDescriptor * Handle Get Descriptor requests @@ -400,18 +377,25 @@ USBD_StatusTypeDef USBD_StdEPReq (USBD_HandleTypeDef *pdev , USBD_SetupReqTyped * @param req: usb request * @retval status */ -static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - uint16_t len; - uint8_t *pbuf; - + uint16_t len = 0U; + uint8_t *pbuf = NULL; + uint8_t err = 0U; switch (req->wValue >> 8) { -#if (USBD_LPM_ENABLED == 1U) +#if ((USBD_LPM_ENABLED == 1U) || (USBD_CLASS_BOS_ENABLED == 1U)) case USB_DESC_TYPE_BOS: - pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetBOSDescriptor != NULL) + { + pbuf = pdev->pDesc->GetBOSDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; #endif case USB_DESC_TYPE_DEVICE: @@ -419,14 +403,14 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , break; case USB_DESC_TYPE_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetHSConfigDescriptor(&len); + pbuf = pdev->pClass->GetHSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } else { - pbuf = (uint8_t *)pdev->pClass->GetFSConfigDescriptor(&len); + pbuf = pdev->pClass->GetFSConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_CONFIGURATION; } break; @@ -435,81 +419,159 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , switch ((uint8_t)(req->wValue)) { case USBD_IDX_LANGID_STR: - pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetLangIDStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetLangIDStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_MFC_STR: - pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetManufacturerStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetManufacturerStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_PRODUCT_STR: - pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetProductStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetProductStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_SERIAL_STR: - pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetSerialStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetSerialStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_CONFIG_STR: - pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetConfigurationStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetConfigurationStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; case USBD_IDX_INTERFACE_STR: - pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + if (pdev->pDesc->GetInterfaceStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetInterfaceStrDescriptor(pdev->dev_speed, &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } break; default: -#if (USBD_SUPPORT_USER_STRING == 1U) - pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue) , &len); - break; +#if (USBD_SUPPORT_USER_STRING_DESC == 1U) + if (pdev->pClass->GetUsrStrDescriptor != NULL) + { + pbuf = pdev->pClass->GetUsrStrDescriptor(pdev, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } +#elif (USBD_CLASS_USER_STRING_DESC == 1U) + if (pdev->pDesc->GetUserStrDescriptor != NULL) + { + pbuf = pdev->pDesc->GetUserStrDescriptor(pdev->dev_speed, (req->wValue), &len); + } + else + { + USBD_CtlError(pdev, req); + err++; + } #else - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; #endif + break; } break; - case USB_DESC_TYPE_DEVICE_QUALIFIER: - if(pdev->dev_speed == USBD_SPEED_HIGH) + case USB_DESC_TYPE_DEVICE_QUALIFIER: + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetDeviceQualifierDescriptor(&len); - break; + pbuf = pdev->pClass->GetDeviceQualifierDescriptor(&len); } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: - if(pdev->dev_speed == USBD_SPEED_HIGH ) + if (pdev->dev_speed == USBD_SPEED_HIGH) { - pbuf = (uint8_t *)pdev->pClass->GetOtherSpeedConfigDescriptor(&len); + pbuf = pdev->pClass->GetOtherSpeedConfigDescriptor(&len); pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; - break; } else { - USBD_CtlError(pdev , req); - return; + USBD_CtlError(pdev, req); + err++; } + break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); + err++; + break; + } + + if (err != 0U) + { return; } - - if((len != 0U) && (req->wLength != 0U)) + else { - - len = MIN(len, req->wLength); - - USBD_CtlSendData (pdev, pbuf, len); - } - - if(req->wLength == 0U) - { - USBD_CtlSendStatus(pdev); + if (req->wLength != 0U) + { + if (len != 0U) + { + len = MIN(len, req->wLength); + (void)USBD_CtlSendData(pdev, pbuf, len); + } + else + { + USBD_CtlError(pdev, req); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } } } @@ -520,8 +582,7 @@ static void USBD_GetDescriptor(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetAddress(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetAddress(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { uint8_t dev_addr; @@ -531,13 +592,13 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , if (pdev->dev_state == USBD_STATE_CONFIGURED) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { pdev->dev_address = dev_addr; - USBD_LL_SetUSBAddress(pdev, dev_addr); - USBD_CtlSendStatus(pdev); + (void)USBD_LL_SetUSBAddress(pdev, dev_addr); + (void)USBD_CtlSendStatus(pdev); if (dev_addr != 0U) { @@ -562,8 +623,9 @@ static void USBD_SetAddress(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) +static USBD_StatusTypeDef USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { + USBD_StatusTypeDef ret = USBD_OK; static uint8_t cfgidx; cfgidx = (uint8_t)(req->wValue); @@ -571,63 +633,77 @@ static void USBD_SetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) if (cfgidx > USBD_MAX_NUM_CONFIGURATION) { USBD_CtlError(pdev, req); + return USBD_FAIL; } - else + + switch (pdev->dev_state) { - switch (pdev->dev_state) + case USBD_STATE_ADDRESSED: + if (cfgidx != 0U) { - case USBD_STATE_ADDRESSED: - if (cfgidx) + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) { - pdev->dev_config = cfgidx; + USBD_CtlError(pdev, req); + } + else + { + (void)USBD_CtlSendStatus(pdev); pdev->dev_state = USBD_STATE_CONFIGURED; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - case USBD_STATE_CONFIGURED: - if (cfgidx == 0U) - { - pdev->dev_state = USBD_STATE_ADDRESSED; - pdev->dev_config = cfgidx; - USBD_ClrClassConfig(pdev, cfgidx); - USBD_CtlSendStatus(pdev); - } - else if (cfgidx != pdev->dev_config) - { - /* Clear old configuration */ - USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); - - /* set new configuration */ - pdev->dev_config = cfgidx; - if(USBD_SetClassConfig(pdev, cfgidx) == USBD_FAIL) - { - USBD_CtlError(pdev, req); - return; - } - USBD_CtlSendStatus(pdev); - } - else - { - USBD_CtlSendStatus(pdev); - } - break; - - default: - USBD_CtlError(pdev, req); - USBD_ClrClassConfig(pdev, cfgidx); - break; } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + case USBD_STATE_CONFIGURED: + if (cfgidx == 0U) + { + pdev->dev_state = USBD_STATE_ADDRESSED; + pdev->dev_config = cfgidx; + (void)USBD_ClrClassConfig(pdev, cfgidx); + (void)USBD_CtlSendStatus(pdev); + } + else if (cfgidx != pdev->dev_config) + { + /* Clear old configuration */ + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + + /* set new configuration */ + pdev->dev_config = cfgidx; + + ret = USBD_SetClassConfig(pdev, cfgidx); + + if (ret != USBD_OK) + { + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, (uint8_t)pdev->dev_config); + pdev->dev_state = USBD_STATE_ADDRESSED; + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + } + else + { + (void)USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev, req); + (void)USBD_ClrClassConfig(pdev, cfgidx); + ret = USBD_FAIL; + break; } + + return ret; } /** @@ -641,7 +717,7 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { if (req->wLength != 1U) { - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); } else { @@ -650,15 +726,15 @@ static void USBD_GetConfig(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: pdev->dev_default_config = 0U; - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_default_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_default_config, 1U); break; case USBD_STATE_CONFIGURED: - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config, 1U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config, 1U); break; default: - USBD_CtlError(pdev , req); + USBD_CtlError(pdev, req); break; } } @@ -678,28 +754,28 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) case USBD_STATE_DEFAULT: case USBD_STATE_ADDRESSED: case USBD_STATE_CONFIGURED: - if(req->wLength != 0x2U) + if (req->wLength != 0x2U) { USBD_CtlError(pdev, req); break; } -#if ( USBD_SELF_POWERED == 1U) +#if (USBD_SELF_POWERED == 1U) pdev->dev_config_status = USB_CONFIG_SELF_POWERED; #else pdev->dev_config_status = 0U; #endif - if (pdev->dev_remote_wakeup) + if (pdev->dev_remote_wakeup != 0U) { pdev->dev_config_status |= USB_CONFIG_REMOTE_WAKEUP; } - USBD_CtlSendData (pdev, (uint8_t *)(void *)&pdev->dev_config_status, 2U); + (void)USBD_CtlSendData(pdev, (uint8_t *)&pdev->dev_config_status, 2U); break; - default : - USBD_CtlError(pdev , req); + default: + USBD_CtlError(pdev, req); break; } } @@ -712,16 +788,13 @@ static void USBD_GetStatus(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) * @param req: usb request * @retval status */ -static void USBD_SetFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_SetFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) { pdev->dev_remote_wakeup = 1U; - USBD_CtlSendStatus(pdev); + (void)USBD_CtlSendStatus(pdev); } - } @@ -732,24 +805,23 @@ static void USBD_SetFeature(USBD_HandleTypeDef *pdev , * @param req: usb request * @retval status */ -static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +static void USBD_ClrFeature(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { switch (pdev->dev_state) { - case USBD_STATE_DEFAULT: - case USBD_STATE_ADDRESSED: - case USBD_STATE_CONFIGURED: - if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) - { - pdev->dev_remote_wakeup = 0U; - USBD_CtlSendStatus(pdev); - } - break; + case USBD_STATE_DEFAULT: + case USBD_STATE_ADDRESSED: + case USBD_STATE_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev_remote_wakeup = 0U; + (void)USBD_CtlSendStatus(pdev); + } + break; - default : - USBD_CtlError(pdev , req); - break; + default: + USBD_CtlError(pdev, req); + break; } } @@ -763,12 +835,23 @@ static void USBD_ClrFeature(USBD_HandleTypeDef *pdev , void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) { - req->bmRequest = *(uint8_t *) (pdata); - req->bRequest = *(uint8_t *) (pdata + 1); - req->wValue = SWAPBYTE (pdata + 2); - req->wIndex = SWAPBYTE (pdata + 4); - req->wLength = SWAPBYTE (pdata + 6); + uint8_t *pbuff = pdata; + req->bmRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->bRequest = *(uint8_t *)(pbuff); + + pbuff++; + req->wValue = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wIndex = SWAPBYTE(pbuff); + + pbuff++; + pbuff++; + req->wLength = SWAPBYTE(pbuff); } /** @@ -779,11 +862,12 @@ void USBD_ParseSetupRequest(USBD_SetupReqTypedef *req, uint8_t *pdata) * @retval None */ -void USBD_CtlError( USBD_HandleTypeDef *pdev , - USBD_SetupReqTypedef *req) +void USBD_CtlError(USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req) { - USBD_LL_StallEP(pdev , 0x80U); - USBD_LL_StallEP(pdev , 0U); + UNUSED(req); + + (void)USBD_LL_StallEP(pdev, 0x80U); + (void)USBD_LL_StallEP(pdev, 0U); } @@ -798,18 +882,29 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) { uint8_t idx = 0U; + uint8_t *pdesc; - if (desc != NULL) + if (desc == NULL) { - *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; - unicode[idx++] = *(uint8_t *)(void *)len; - unicode[idx++] = USB_DESC_TYPE_STRING; + return; + } - while (*desc != '\0') - { - unicode[idx++] = *desc++; - unicode[idx++] = 0U; - } + pdesc = desc; + *len = ((uint16_t)USBD_GetLen(pdesc) * 2U) + 2U; + + unicode[idx] = *(uint8_t *)len; + idx++; + unicode[idx] = USB_DESC_TYPE_STRING; + idx++; + + while (*pdesc != (uint8_t)'\0') + { + unicode[idx] = *pdesc; + pdesc++; + idx++; + + unicode[idx] = 0U; + idx++; } } @@ -821,15 +916,16 @@ void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) */ static uint8_t USBD_GetLen(uint8_t *buf) { - uint8_t len = 0U; + uint8_t len = 0U; + uint8_t *pbuff = buf; - while (*buf != '\0') - { - len++; - buf++; - } + while (*pbuff != (uint8_t)'\0') + { + len++; + pbuff++; + } - return len; + return len; } /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c index 5600c370..4d5c8efe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c @@ -12,7 +12,7 @@ * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: - * http://www.st.com/SLA0044 + * www.st.com/SLA0044 * ****************************************************************************** */ @@ -84,16 +84,16 @@ * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_IN; pdev->ep_in[0].total_length = len; - pdev->ep_in[0].rem_length = len; + pdev->ep_in[0].rem_length = len; - /* Start the transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -106,11 +106,11 @@ USBD_StatusTypeDef USBD_CtlSendData (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be sent * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, - uint8_t *pbuf, uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueSendData(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - /* Start the next transfer */ - USBD_LL_Transmit (pdev, 0x00U, pbuf, len); + /* Start the next transfer */ + (void)USBD_LL_Transmit(pdev, 0x00U, pbuf, len); return USBD_OK; } @@ -123,16 +123,16 @@ USBD_StatusTypeDef USBD_CtlContinueSendData (USBD_HandleTypeDef *pdev, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlPrepareRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_DATA_OUT; pdev->ep_out[0].total_length = len; - pdev->ep_out[0].rem_length = len; + pdev->ep_out[0].rem_length = len; /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -145,10 +145,10 @@ USBD_StatusTypeDef USBD_CtlPrepareRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param len: length of data to be received * @retval status */ -USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, - uint16_t len) +USBD_StatusTypeDef USBD_CtlContinueRx(USBD_HandleTypeDef *pdev, + uint8_t *pbuf, uint32_t len) { - USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); + (void)USBD_LL_PrepareReceive(pdev, 0U, pbuf, len); return USBD_OK; } @@ -159,13 +159,13 @@ USBD_StatusTypeDef USBD_CtlContinueRx (USBD_HandleTypeDef *pdev, uint8_t *pbuf, * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlSendStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_IN; /* Start the transfer */ - USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); + (void)USBD_LL_Transmit(pdev, 0x00U, NULL, 0U); return USBD_OK; } @@ -176,13 +176,13 @@ USBD_StatusTypeDef USBD_CtlSendStatus (USBD_HandleTypeDef *pdev) * @param pdev: device instance * @retval status */ -USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) +USBD_StatusTypeDef USBD_CtlReceiveStatus(USBD_HandleTypeDef *pdev) { /* Set EP0 State */ pdev->ep0_state = USBD_EP0_STATUS_OUT; - /* Start the transfer */ - USBD_LL_PrepareReceive (pdev, 0U, NULL, 0U); + /* Start the transfer */ + (void)USBD_LL_PrepareReceive(pdev, 0U, NULL, 0U); return USBD_OK; } @@ -194,7 +194,7 @@ USBD_StatusTypeDef USBD_CtlReceiveStatus (USBD_HandleTypeDef *pdev) * @param ep_addr: endpoint address * @retval Rx Data blength */ -uint32_t USBD_GetRxCount (USBD_HandleTypeDef *pdev, uint8_t ep_addr) +uint32_t USBD_GetRxCount(USBD_HandleTypeDef *pdev, uint8_t ep_addr) { return USBD_LL_GetRxDataSize(pdev, ep_addr); } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.c index 2c7b2f09..6738d157 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.c @@ -504,7 +504,7 @@ USBD_StatusTypeDef USBD_LL_SetUSBAddress(USBD_HandleTypeDef *pdev, uint8_t dev_a * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; @@ -524,7 +524,7 @@ USBD_StatusTypeDef USBD_LL_Transmit(USBD_HandleTypeDef *pdev, uint8_t ep_addr, u * @param size: Data size * @retval USBD status */ -USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint16_t size) +USBD_StatusTypeDef USBD_LL_PrepareReceive(USBD_HandleTypeDef *pdev, uint8_t ep_addr, uint8_t *pbuf, uint32_t size) { HAL_StatusTypeDef hal_status = HAL_OK; USBD_StatusTypeDef usb_status = USBD_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.h index 457df6b8..13647fbd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_conf.h @@ -68,8 +68,6 @@ /*---------- -----------*/ #define USBD_MAX_STR_DESC_SIZ 512U /*---------- -----------*/ -#define USBD_SUPPORT_USER_STRING 0U -/*---------- -----------*/ #define USBD_DEBUG_LEVEL 0U /*---------- -----------*/ #define USBD_LPM_ENABLED 0U @@ -81,6 +79,9 @@ #define DEVICE_FS 0 #define DEVICE_HS 1 +/* Inform USB core that a full speed device is used. */ +#define USE_USB_FS + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_desc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_desc.c index c26b821d..344676bb 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_desc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Boot/usbd_desc.c @@ -123,11 +123,6 @@ uint8_t * USBD_FS_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_ConfigStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); uint8_t * USBD_FS_InterfaceStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); - -#ifdef USBD_SUPPORT_USER_STRING_DESC -uint8_t * USBD_FS_USRStringDesc(USBD_SpeedTypeDef speed, uint8_t idx, uint16_t *length); -#endif /* USBD_SUPPORT_USER_STRING_DESC */ - #if (USBD_LPM_ENABLED == 1) uint8_t * USBD_FS_USR_BOSDescriptor(USBD_SpeedTypeDef speed, uint16_t *length); #endif /* (USBD_LPM_ENABLED == 1) */ @@ -328,7 +323,9 @@ uint8_t * USBD_FS_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) /* Update the serial number string descriptor with the data from the unique * ID */ Get_SerialNum(); - + /* USER CODE BEGIN USBD_FS_SerialStrDescriptor */ + + /* USER CODE END USBD_FS_SerialStrDescriptor */ return (uint8_t *) USBD_StringSerial; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/Debug/demoprog_stm32f746.elf b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/Debug/demoprog_stm32f746.elf index c7ea449d73f8154746c4fedfc7e72ea392e4d565..954ad98eb346c77293022b3f90145a541815d55e 100755 GIT binary patch delta 39300 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
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -1433,28 +1417,32 @@ typedef struct /* Analog to Digital Converter */ /* */ /******************************************************************************/ +#define VREFINT_CAL_ADDR_CMSIS ((uint16_t*) (0x1FF0F44A)) /*!
© COPYRIGHT(c) 2016 STMicroelectronics

+ *

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

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -72,10 +56,10 @@ /* Uncomment the line below according to the target STM32 device used in your application */ -#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F767xx) && \ - !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && !defined (STM32F722xx) && \ - !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && !defined (STM32F730xx) && \ - !defined (STM32F750xx) +#if !defined (STM32F756xx) && !defined (STM32F746xx) && !defined (STM32F745xx) && !defined (STM32F765xx) && \ + !defined (STM32F767xx) && !defined (STM32F769xx) && !defined (STM32F777xx) && !defined (STM32F779xx) && \ + !defined (STM32F722xx) && !defined (STM32F723xx) && !defined (STM32F732xx) && !defined (STM32F733xx) && \ + !defined (STM32F730xx) && !defined (STM32F750xx) /* #define STM32F756xx */ /*!< STM32F756VG, STM32F756ZG, STM32F756ZG, STM32F756IG, STM32F756BG, STM32F756NG Devices */ @@ -113,11 +97,11 @@ #endif /* USE_HAL_DRIVER */ /** - * @brief CMSIS Device version number V1.2.4 + * @brief CMSIS Device version number V1.2.5 */ #define __STM32F7_CMSIS_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7_CMSIS_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7_CMSIS_VERSION_SUB2 (0x04) /*!< [15:8] sub2 version */ +#define __STM32F7_CMSIS_VERSION_SUB2 (0x05) /*!< [15:8] sub2 version */ #define __STM32F7_CMSIS_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7_CMSIS_VERSION ((__STM32F7_CMSIS_VERSION_MAIN << 24)\ |(__STM32F7_CMSIS_VERSION_SUB1 << 16)\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h index 13b68bc2..2d265fb6 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h @@ -7,7 +7,7 @@ ****************************************************************************** * @attention * - *

© Copyright (c) 2018 STMicroelectronics. + *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, @@ -236,6 +236,16 @@ #define DAC_WAVEGENERATION_NOISE DAC_WAVE_NOISE #define DAC_WAVEGENERATION_TRIANGLE DAC_WAVE_TRIANGLE +#if defined(STM32G4) || defined(STM32H7) +#define DAC_CHIPCONNECT_DISABLE DAC_CHIPCONNECT_EXTERNAL +#define DAC_CHIPCONNECT_ENABLE DAC_CHIPCONNECT_INTERNAL +#endif + +#if defined(STM32L1) || defined(STM32L4) || defined(STM32G0) || defined(STM32L5) || defined(STM32H7) || defined(STM32F4) +#define HAL_DAC_MSP_INIT_CB_ID HAL_DAC_MSPINIT_CB_ID +#define HAL_DAC_MSP_DEINIT_CB_ID HAL_DAC_MSPDEINIT_CB_ID +#endif + /** * @} */ @@ -296,8 +306,17 @@ #define HAL_DMAMUX_REQUEST_GEN_FALLING HAL_DMAMUX_REQ_GEN_FALLING #define HAL_DMAMUX_REQUEST_GEN_RISING_FALLING HAL_DMAMUX_REQ_GEN_RISING_FALLING +#if defined(STM32L4R5xx) || defined(STM32L4R9xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) || defined(STM32L4S7xx) || defined(STM32L4S9xx) +#define DMA_REQUEST_DCMI_PSSI DMA_REQUEST_DCMI +#endif + #endif /* STM32L4 */ +#if defined(STM32G0) +#define DMA_REQUEST_DAC1_CHANNEL1 DMA_REQUEST_DAC1_CH1 +#define DMA_REQUEST_DAC1_CHANNEL2 DMA_REQUEST_DAC1_CH2 +#endif + #if defined(STM32H7) #define DMA_REQUEST_DAC1 DMA_REQUEST_DAC1_CH1 @@ -355,6 +374,9 @@ #define DFSDM_FILTER_EXT_TRIG_LPTIM2 DFSDM_FILTER_EXT_TRIG_LPTIM2_OUT #define DFSDM_FILTER_EXT_TRIG_LPTIM3 DFSDM_FILTER_EXT_TRIG_LPTIM3_OUT +#define DAC_TRIGGER_LP1_OUT DAC_TRIGGER_LPTIM1_OUT +#define DAC_TRIGGER_LP2_OUT DAC_TRIGGER_LPTIM2_OUT + #endif /* STM32H7 */ /** @@ -450,7 +472,9 @@ #define FLASH_FLAG_SNECCE_BANK2RR FLASH_FLAG_SNECCERR_BANK2 #define FLASH_FLAG_DBECCE_BANK2RR FLASH_FLAG_DBECCERR_BANK2 #define FLASH_FLAG_STRBER_BANK2R FLASH_FLAG_STRBERR_BANK2 -#endif +#define FLASH_FLAG_WDW FLASH_FLAG_WBNE +#define OB_WRP_SECTOR_All OB_WRP_SECTOR_ALL +#endif /* STM32H7 */ /** * @} @@ -486,6 +510,13 @@ #define HAL_SYSCFG_FASTMODEPLUS_I2C1 I2C_FASTMODEPLUS_I2C1 #define HAL_SYSCFG_FASTMODEPLUS_I2C2 I2C_FASTMODEPLUS_I2C2 #define HAL_SYSCFG_FASTMODEPLUS_I2C3 I2C_FASTMODEPLUS_I2C3 +#if defined(STM32G4) + +#define HAL_SYSCFG_EnableIOAnalogSwitchBooster HAL_SYSCFG_EnableIOSwitchBooster +#define HAL_SYSCFG_DisableIOAnalogSwitchBooster HAL_SYSCFG_DisableIOSwitchBooster +#define HAL_SYSCFG_EnableIOAnalogSwitchVDD HAL_SYSCFG_EnableIOSwitchVDD +#define HAL_SYSCFG_DisableIOAnalogSwitchVDD HAL_SYSCFG_DisableIOSwitchVDD +#endif /* STM32G4 */ /** * @} */ @@ -494,7 +525,7 @@ /** @defgroup LL_FMC_Aliased_Defines LL FMC Aliased Defines maintained for compatibility purpose * @{ */ -#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define FMC_NAND_PCC_WAIT_FEATURE_DISABLE FMC_NAND_WAIT_FEATURE_DISABLE #define FMC_NAND_PCC_WAIT_FEATURE_ENABLE FMC_NAND_WAIT_FEATURE_ENABLE #define FMC_NAND_PCC_MEM_BUS_WIDTH_8 FMC_NAND_MEM_BUS_WIDTH_8 @@ -547,18 +578,25 @@ #define GPIO_AF9_SDIO2 GPIO_AF9_SDMMC2 #define GPIO_AF10_SDIO2 GPIO_AF10_SDMMC2 #define GPIO_AF11_SDIO2 GPIO_AF11_SDMMC2 -#endif + +#if defined (STM32H743xx) || defined (STM32H753xx) || defined (STM32H750xx) || defined (STM32H742xx) || \ + defined (STM32H745xx) || defined (STM32H755xx) || defined (STM32H747xx) || defined (STM32H757xx) +#define GPIO_AF10_OTG2_HS GPIO_AF10_OTG2_FS +#define GPIO_AF10_OTG1_FS GPIO_AF10_OTG1_HS +#define GPIO_AF12_OTG2_FS GPIO_AF12_OTG1_FS +#endif /*STM32H743xx || STM32H753xx || STM32H750xx || STM32H742xx || STM32H745xx || STM32H755xx || STM32H747xx || STM32H757xx */ +#endif /* STM32H7 */ #define GPIO_AF0_LPTIM GPIO_AF0_LPTIM1 #define GPIO_AF1_LPTIM GPIO_AF1_LPTIM1 #define GPIO_AF2_LPTIM GPIO_AF2_LPTIM1 -#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32H7) +#if defined(STM32L0) || defined(STM32L4) || defined(STM32F4) || defined(STM32F2) || defined(STM32F7) || defined(STM32G4) || defined(STM32H7) #define GPIO_SPEED_LOW GPIO_SPEED_FREQ_LOW #define GPIO_SPEED_MEDIUM GPIO_SPEED_FREQ_MEDIUM #define GPIO_SPEED_FAST GPIO_SPEED_FREQ_HIGH #define GPIO_SPEED_HIGH GPIO_SPEED_FREQ_VERY_HIGH -#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32H7*/ +#endif /* STM32L0 || STM32L4 || STM32F4 || STM32F2 || STM32F7 || STM32G4 || STM32H7*/ #if defined(STM32L1) #define GPIO_SPEED_VERY_LOW GPIO_SPEED_FREQ_LOW @@ -599,6 +637,185 @@ #define __HAL_HRTIM_GetClockPrescaler __HAL_HRTIM_GETCLOCKPRESCALER #define __HAL_HRTIM_SetCompare __HAL_HRTIM_SETCOMPARE #define __HAL_HRTIM_GetCompare __HAL_HRTIM_GETCOMPARE + +#if defined(STM32G4) +#define HAL_HRTIM_ExternalEventCounterConfig HAL_HRTIM_ExtEventCounterConfig +#define HAL_HRTIM_ExternalEventCounterEnable HAL_HRTIM_ExtEventCounterEnable +#define HAL_HRTIM_ExternalEventCounterDisable HAL_HRTIM_ExtEventCounterDisable +#define HAL_HRTIM_ExternalEventCounterReset HAL_HRTIM_ExtEventCounterReset +#endif /* STM32G4 */ + +#if defined(STM32H7) +#define HRTIM_OUTPUTSET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTSET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTSET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTSET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTSET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTSET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTSET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTSET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTSET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTSET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 + +#define HRTIM_OUTPUTRESET_TIMAEV1_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMAEV2_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMAEV3_TIMCCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMAEV4_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMAEV5_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMAEV6_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMAEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMAEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMAEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMBEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMBEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMBEV3_TIMCCMP3 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMBEV4_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMBEV5_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMBEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMBEV7_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMBEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMBEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMCEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMCEV2_TIMACMP2 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMCEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMCEV4_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMCEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMCEV6_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMCEV7_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMCEV8_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMCEV9_TIMFCMP2 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMDEV1_TIMACMP1 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMDEV2_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMDEV3_TIMBCMP2 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMDEV4_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMDEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMDEV6_TIMECMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMDEV7_TIMECMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMDEV8_TIMFCMP1 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMDEV9_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMEEV1_TIMACMP4 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMEEV2_TIMBCMP3 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMEEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMEEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMEEV5_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMEEV6_TIMDCMP1 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMEEV7_TIMDCMP2 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMEEV8_TIMFCMP3 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMEEV9_TIMFCMP4 HRTIM_OUTPUTSET_TIMEV_9 +#define HRTIM_OUTPUTRESET_TIMFEV1_TIMACMP3 HRTIM_OUTPUTSET_TIMEV_1 +#define HRTIM_OUTPUTRESET_TIMFEV2_TIMBCMP1 HRTIM_OUTPUTSET_TIMEV_2 +#define HRTIM_OUTPUTRESET_TIMFEV3_TIMBCMP4 HRTIM_OUTPUTSET_TIMEV_3 +#define HRTIM_OUTPUTRESET_TIMFEV4_TIMCCMP1 HRTIM_OUTPUTSET_TIMEV_4 +#define HRTIM_OUTPUTRESET_TIMFEV5_TIMCCMP4 HRTIM_OUTPUTSET_TIMEV_5 +#define HRTIM_OUTPUTRESET_TIMFEV6_TIMDCMP3 HRTIM_OUTPUTSET_TIMEV_6 +#define HRTIM_OUTPUTRESET_TIMFEV7_TIMDCMP4 HRTIM_OUTPUTSET_TIMEV_7 +#define HRTIM_OUTPUTRESET_TIMFEV8_TIMECMP2 HRTIM_OUTPUTSET_TIMEV_8 +#define HRTIM_OUTPUTRESET_TIMFEV9_TIMECMP3 HRTIM_OUTPUTSET_TIMEV_9 +#endif /* STM32H7 */ + +#if defined(STM32F3) +/** @brief Constants defining available sources associated to external events. + */ +#define HRTIM_EVENTSRC_1 (0x00000000U) +#define HRTIM_EVENTSRC_2 (HRTIM_EECR1_EE1SRC_0) +#define HRTIM_EVENTSRC_3 (HRTIM_EECR1_EE1SRC_1) +#define HRTIM_EVENTSRC_4 (HRTIM_EECR1_EE1SRC_1 | HRTIM_EECR1_EE1SRC_0) + +/** @brief Constants defining the events that can be selected to configure the + * set/reset crossbar of a timer output + */ +#define HRTIM_OUTPUTSET_TIMEV_1 (HRTIM_SET1R_TIMEVNT1) +#define HRTIM_OUTPUTSET_TIMEV_2 (HRTIM_SET1R_TIMEVNT2) +#define HRTIM_OUTPUTSET_TIMEV_3 (HRTIM_SET1R_TIMEVNT3) +#define HRTIM_OUTPUTSET_TIMEV_4 (HRTIM_SET1R_TIMEVNT4) +#define HRTIM_OUTPUTSET_TIMEV_5 (HRTIM_SET1R_TIMEVNT5) +#define HRTIM_OUTPUTSET_TIMEV_6 (HRTIM_SET1R_TIMEVNT6) +#define HRTIM_OUTPUTSET_TIMEV_7 (HRTIM_SET1R_TIMEVNT7) +#define HRTIM_OUTPUTSET_TIMEV_8 (HRTIM_SET1R_TIMEVNT8) +#define HRTIM_OUTPUTSET_TIMEV_9 (HRTIM_SET1R_TIMEVNT9) + +#define HRTIM_OUTPUTRESET_TIMEV_1 (HRTIM_RST1R_TIMEVNT1) +#define HRTIM_OUTPUTRESET_TIMEV_2 (HRTIM_RST1R_TIMEVNT2) +#define HRTIM_OUTPUTRESET_TIMEV_3 (HRTIM_RST1R_TIMEVNT3) +#define HRTIM_OUTPUTRESET_TIMEV_4 (HRTIM_RST1R_TIMEVNT4) +#define HRTIM_OUTPUTRESET_TIMEV_5 (HRTIM_RST1R_TIMEVNT5) +#define HRTIM_OUTPUTRESET_TIMEV_6 (HRTIM_RST1R_TIMEVNT6) +#define HRTIM_OUTPUTRESET_TIMEV_7 (HRTIM_RST1R_TIMEVNT7) +#define HRTIM_OUTPUTRESET_TIMEV_8 (HRTIM_RST1R_TIMEVNT8) +#define HRTIM_OUTPUTRESET_TIMEV_9 (HRTIM_RST1R_TIMEVNT9) + +/** @brief Constants defining the event filtering applied to external events + * by a timer + */ +#define HRTIM_TIMEVENTFILTER_NONE (0x00000000U) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP1 (HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP2 (HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP3 (HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGCMP4 (HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR1 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR2 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR3 (HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR4 (HRTIM_EEFR1_EE1FLTR_3) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR5 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR6 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR7 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_BLANKINGFLTR8 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP2 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_0) +#define HRTIM_TIMEVENTFILTER_WINDOWINGCMP3 (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1) +#define HRTIM_TIMEVENTFILTER_WINDOWINGTIM (HRTIM_EEFR1_EE1FLTR_3 | HRTIM_EEFR1_EE1FLTR_2 | HRTIM_EEFR1_EE1FLTR_1 | HRTIM_EEFR1_EE1FLTR_0) + +/** @brief Constants defining the DLL calibration periods (in micro seconds) + */ +#define HRTIM_CALIBRATIONRATE_7300 0x00000000U +#define HRTIM_CALIBRATIONRATE_910 (HRTIM_DLLCR_CALRTE_0) +#define HRTIM_CALIBRATIONRATE_114 (HRTIM_DLLCR_CALRTE_1) +#define HRTIM_CALIBRATIONRATE_14 (HRTIM_DLLCR_CALRTE_1 | HRTIM_DLLCR_CALRTE_0) + +#endif /* STM32F3 */ /** * @} */ @@ -738,6 +955,12 @@ #define OPAMP_PGACONNECT_VM0 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO0 #define OPAMP_PGACONNECT_VM1 OPAMP_PGA_CONNECT_INVERTINGINPUT_IO1 +#if defined(STM32L1) || defined(STM32L4) || defined(STM32L5) || defined(STM32H7) +#define HAL_OPAMP_MSP_INIT_CB_ID HAL_OPAMP_MSPINIT_CB_ID +#define HAL_OPAMP_MSP_DEINIT_CB_ID HAL_OPAMP_MSPDEINIT_CB_ID +#endif + + /** * @} */ @@ -753,7 +976,6 @@ #define I2S_FLAG_TXE I2S_FLAG_TXP #define I2S_FLAG_RXNE I2S_FLAG_RXP - #define I2S_FLAG_FRE I2S_FLAG_TIFRE #endif #if defined(STM32F7) @@ -824,6 +1046,16 @@ #define RTC_TAMPERPIN_PA0 RTC_TAMPERPIN_POS1 #define RTC_TAMPERPIN_PI8 RTC_TAMPERPIN_POS1 +#if defined(STM32H7) +#define RTC_TAMPCR_TAMPXE RTC_TAMPER_X +#define RTC_TAMPCR_TAMPXIE RTC_TAMPER_X_INTERRUPT + +#define RTC_TAMPER1_INTERRUPT RTC_IT_TAMP1 +#define RTC_TAMPER2_INTERRUPT RTC_IT_TAMP2 +#define RTC_TAMPER3_INTERRUPT RTC_IT_TAMP3 +#define RTC_ALL_TAMPER_INTERRUPT RTC_IT_TAMPALL +#endif /* STM32H7 */ + /** * @} */ @@ -971,6 +1203,24 @@ #define IS_TIM_HALL_INTERFACE_INSTANCE IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE #endif +#if defined(STM32H7) +#define TIM_TIM1_ETR_COMP1_OUT TIM_TIM1_ETR_COMP1 +#define TIM_TIM1_ETR_COMP2_OUT TIM_TIM1_ETR_COMP2 +#define TIM_TIM8_ETR_COMP1_OUT TIM_TIM8_ETR_COMP1 +#define TIM_TIM8_ETR_COMP2_OUT TIM_TIM8_ETR_COMP2 +#define TIM_TIM2_ETR_COMP1_OUT TIM_TIM2_ETR_COMP1 +#define TIM_TIM2_ETR_COMP2_OUT TIM_TIM2_ETR_COMP2 +#define TIM_TIM3_ETR_COMP1_OUT TIM_TIM3_ETR_COMP1 +#define TIM_TIM1_TI1_COMP1_OUT TIM_TIM1_TI1_COMP1 +#define TIM_TIM8_TI1_COMP2_OUT TIM_TIM8_TI1_COMP2 +#define TIM_TIM2_TI4_COMP1_OUT TIM_TIM2_TI4_COMP1 +#define TIM_TIM2_TI4_COMP2_OUT TIM_TIM2_TI4_COMP2 +#define TIM_TIM2_TI4_COMP1COMP2_OUT TIM_TIM2_TI4_COMP1_COMP2 +#define TIM_TIM3_TI1_COMP1_OUT TIM_TIM3_TI1_COMP1 +#define TIM_TIM3_TI1_COMP2_OUT TIM_TIM3_TI1_COMP2 +#define TIM_TIM3_TI1_COMP1COMP2_OUT TIM_TIM3_TI1_COMP1_COMP2 +#endif + /** * @} */ @@ -1199,6 +1449,30 @@ #define HASH_HMACKeyType_ShortKey HASH_HMAC_KEYTYPE_SHORTKEY #define HASH_HMACKeyType_LongKey HASH_HMAC_KEYTYPE_LONGKEY + +#if defined(STM32L4) || defined(STM32F4) || defined(STM32F7) || defined(STM32H7) + +#define HAL_HASH_MD5_Accumulate HAL_HASH_MD5_Accmlt +#define HAL_HASH_MD5_Accumulate_End HAL_HASH_MD5_Accmlt_End +#define HAL_HASH_MD5_Accumulate_IT HAL_HASH_MD5_Accmlt_IT +#define HAL_HASH_MD5_Accumulate_End_IT HAL_HASH_MD5_Accmlt_End_IT + +#define HAL_HASH_SHA1_Accumulate HAL_HASH_SHA1_Accmlt +#define HAL_HASH_SHA1_Accumulate_End HAL_HASH_SHA1_Accmlt_End +#define HAL_HASH_SHA1_Accumulate_IT HAL_HASH_SHA1_Accmlt_IT +#define HAL_HASH_SHA1_Accumulate_End_IT HAL_HASH_SHA1_Accmlt_End_IT + +#define HAL_HASHEx_SHA224_Accumulate HAL_HASHEx_SHA224_Accmlt +#define HAL_HASHEx_SHA224_Accumulate_End HAL_HASHEx_SHA224_Accmlt_End +#define HAL_HASHEx_SHA224_Accumulate_IT HAL_HASHEx_SHA224_Accmlt_IT +#define HAL_HASHEx_SHA224_Accumulate_End_IT HAL_HASHEx_SHA224_Accmlt_End_IT + +#define HAL_HASHEx_SHA256_Accumulate HAL_HASHEx_SHA256_Accmlt +#define HAL_HASHEx_SHA256_Accumulate_End HAL_HASHEx_SHA256_Accmlt_End +#define HAL_HASHEx_SHA256_Accumulate_IT HAL_HASHEx_SHA256_Accmlt_IT +#define HAL_HASHEx_SHA256_Accumulate_End_IT HAL_HASHEx_SHA256_Accmlt_End_IT + +#endif /* STM32L4 || STM32F4 || STM32F7 || STM32H7 */ /** * @} */ @@ -1221,6 +1495,13 @@ #endif #define HAL_ADC_EnableBuffer_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINT() : HAL_ADCEx_DisableVREFINT()) #define HAL_ADC_EnableBufferSensor_Cmd(cmd) (((cmd)==ENABLE) ? HAL_ADCEx_EnableVREFINTTempSensor() : HAL_ADCEx_DisableVREFINTTempSensor()) +#if defined(STM32H7A3xx) || defined(STM32H7B3xx) || defined(STM32H7B0xx) || defined(STM32H7A3xxQ) || defined(STM32H7B3xxQ) || defined(STM32H7B0xxQ) +#define HAL_EnableSRDomainDBGStopMode HAL_EnableDomain3DBGStopMode +#define HAL_DisableSRDomainDBGStopMode HAL_DisableDomain3DBGStopMode +#define HAL_EnableSRDomainDBGStandbyMode HAL_EnableDomain3DBGStandbyMode +#define HAL_DisableSRDomainDBGStandbyMode HAL_DisableDomain3DBGStandbyMode +#endif /* STM32H7A3xx || STM32H7B3xx || STM32H7B0xx || STM32H7A3xxQ || STM32H7B3xxQ || STM32H7B0xxQ */ + /** * @} */ @@ -1250,16 +1531,18 @@ #define HAL_I2CFastModePlusConfig(SYSCFG_I2CFastModePlus, cmd) (((cmd)==ENABLE)? HAL_I2CEx_EnableFastModePlus(SYSCFG_I2CFastModePlus): HAL_I2CEx_DisableFastModePlus(SYSCFG_I2CFastModePlus)) -#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_IT HAL_I2C_Master_Seq_Transmit_IT #define HAL_I2C_Master_Sequential_Receive_IT HAL_I2C_Master_Seq_Receive_IT #define HAL_I2C_Slave_Sequential_Transmit_IT HAL_I2C_Slave_Seq_Transmit_IT #define HAL_I2C_Slave_Sequential_Receive_IT HAL_I2C_Slave_Seq_Receive_IT +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ +#if defined(STM32H7) || defined(STM32WB) || defined(STM32G0) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) || defined(STM32L5) || defined(STM32G4) #define HAL_I2C_Master_Sequential_Transmit_DMA HAL_I2C_Master_Seq_Transmit_DMA #define HAL_I2C_Master_Sequential_Receive_DMA HAL_I2C_Master_Seq_Receive_DMA #define HAL_I2C_Slave_Sequential_Transmit_DMA HAL_I2C_Slave_Seq_Transmit_DMA #define HAL_I2C_Slave_Sequential_Receive_DMA HAL_I2C_Slave_Seq_Receive_DMA -#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 */ +#endif /* STM32H7 || STM32WB || STM32G0 || STM32F4 || STM32F7 || STM32L0 || STM32L4 || STM32L5 || STM32G4 */ #if defined(STM32F4) #define HAL_FMPI2C_Master_Sequential_Transmit_IT HAL_FMPI2C_Master_Seq_Transmit_IT @@ -1278,6 +1561,13 @@ /** @defgroup HAL_PWR_Aliased HAL PWR Aliased maintained for legacy purpose * @{ */ + +#if defined(STM32G0) +#define HAL_PWR_ConfigPVD HAL_PWREx_ConfigPVD +#define HAL_PWR_EnablePVD HAL_PWREx_EnablePVD +#define HAL_PWR_DisablePVD HAL_PWREx_DisablePVD +#define HAL_PWR_PVD_IRQHandler HAL_PWREx_PVD_IRQHandler +#endif #define HAL_PWR_PVDConfig HAL_PWR_ConfigPVD #define HAL_PWR_DisableBkUpReg HAL_PWREx_DisableBkUpReg #define HAL_PWR_DisableFlashPowerDown HAL_PWREx_DisableFlashPowerDown @@ -1350,14 +1640,14 @@ #define HAL_TIM_DMAError TIM_DMAError #define HAL_TIM_DMACaptureCplt TIM_DMACaptureCplt #define HAL_TIMEx_DMACommutationCplt TIMEx_DMACommutationCplt -#if defined(STM32H7) || defined(STM32G0) || defined(STM32F7) || defined(STM32F4) || defined(STM32L0) +#if defined(STM32H7) || defined(STM32G0) || defined(STM32F0) || defined(STM32F1) || defined(STM32F2) || defined(STM32F3) || defined(STM32F4) || defined(STM32F7) || defined(STM32L0) || defined(STM32L4) #define HAL_TIM_SlaveConfigSynchronization HAL_TIM_SlaveConfigSynchro #define HAL_TIM_SlaveConfigSynchronization_IT HAL_TIM_SlaveConfigSynchro_IT #define HAL_TIMEx_CommutationCallback HAL_TIMEx_CommutCallback #define HAL_TIMEx_ConfigCommutationEvent HAL_TIMEx_ConfigCommutEvent #define HAL_TIMEx_ConfigCommutationEvent_IT HAL_TIMEx_ConfigCommutEvent_IT #define HAL_TIMEx_ConfigCommutationEvent_DMA HAL_TIMEx_ConfigCommutEvent_DMA -#endif /* STM32H7 || STM32G0 || STM32F7 || STM32F4 || STM32L0 */ +#endif /* STM32H7 || STM32G0 || STM32F0 || STM32F1 || STM32F2 || STM32F3 || STM32F4 || STM32F7 || STM32L0 */ /** * @} */ @@ -2476,12 +2766,28 @@ #define __USB_OTG_FS_CLK_DISABLE __HAL_RCC_USB_OTG_FS_CLK_DISABLE #define __USB_OTG_FS_CLK_ENABLE __HAL_RCC_USB_OTG_FS_CLK_ENABLE #define __USB_RELEASE_RESET __HAL_RCC_USB_RELEASE_RESET + +#if defined(STM32H7) +#define __HAL_RCC_WWDG_CLK_DISABLE __HAL_RCC_WWDG1_CLK_DISABLE +#define __HAL_RCC_WWDG_CLK_ENABLE __HAL_RCC_WWDG1_CLK_ENABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG1_CLK_SLEEP_DISABLE +#define __HAL_RCC_WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG1_CLK_SLEEP_ENABLE + +#define __HAL_RCC_WWDG_FORCE_RESET ((void)0U) /* Not available on the STM32H7*/ +#define __HAL_RCC_WWDG_RELEASE_RESET ((void)0U) /* Not available on the STM32H7*/ + + +#define __HAL_RCC_WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG1_IS_CLK_ENABLED +#define __HAL_RCC_WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG1_IS_CLK_DISABLED +#endif + #define __WWDG_CLK_DISABLE __HAL_RCC_WWDG_CLK_DISABLE #define __WWDG_CLK_ENABLE __HAL_RCC_WWDG_CLK_ENABLE #define __WWDG_CLK_SLEEP_DISABLE __HAL_RCC_WWDG_CLK_SLEEP_DISABLE #define __WWDG_CLK_SLEEP_ENABLE __HAL_RCC_WWDG_CLK_SLEEP_ENABLE #define __WWDG_FORCE_RESET __HAL_RCC_WWDG_FORCE_RESET #define __WWDG_RELEASE_RESET __HAL_RCC_WWDG_RELEASE_RESET + #define __TIM21_CLK_ENABLE __HAL_RCC_TIM21_CLK_ENABLE #define __TIM21_CLK_DISABLE __HAL_RCC_TIM21_CLK_DISABLE #define __TIM21_FORCE_RESET __HAL_RCC_TIM21_FORCE_RESET @@ -2814,6 +3120,15 @@ #define __WWDG_IS_CLK_ENABLED __HAL_RCC_WWDG_IS_CLK_ENABLED #define __WWDG_IS_CLK_DISABLED __HAL_RCC_WWDG_IS_CLK_DISABLED +#if defined(STM32L1) +#define __HAL_RCC_CRYP_CLK_DISABLE __HAL_RCC_AES_CLK_DISABLE +#define __HAL_RCC_CRYP_CLK_ENABLE __HAL_RCC_AES_CLK_ENABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_DISABLE __HAL_RCC_AES_CLK_SLEEP_DISABLE +#define __HAL_RCC_CRYP_CLK_SLEEP_ENABLE __HAL_RCC_AES_CLK_SLEEP_ENABLE +#define __HAL_RCC_CRYP_FORCE_RESET __HAL_RCC_AES_FORCE_RESET +#define __HAL_RCC_CRYP_RELEASE_RESET __HAL_RCC_AES_RELEASE_RESET +#endif /* STM32L1 */ + #if defined(STM32F4) #define __HAL_RCC_SDMMC1_FORCE_RESET __HAL_RCC_SDIO_FORCE_RESET #define __HAL_RCC_SDMMC1_RELEASE_RESET __HAL_RCC_SDIO_RELEASE_RESET @@ -2930,7 +3245,7 @@ #if defined(STM32L4) #define RCC_RTCCLKSOURCE_NO_CLK RCC_RTCCLKSOURCE_NONE -#elif defined(STM32WB) || defined(STM32G0) +#elif defined(STM32WB) || defined(STM32G0) || defined(STM32G4) || defined(STM32L5) #else #define RCC_RTCCLKSOURCE_NONE RCC_RTCCLKSOURCE_NO_CLK #endif @@ -3058,7 +3373,7 @@ /** @defgroup HAL_RTC_Aliased_Macros HAL RTC Aliased Macros maintained for legacy purpose * @{ */ -#if defined (STM32G0) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) +#if defined (STM32G0) || defined (STM32L5) || defined (STM32L412xx) || defined (STM32L422xx) || defined (STM32L4P5xx) || defined (STM32L4Q5xx) || defined (STM32G4) #else #define __HAL_RTC_CLEAR_FLAG __HAL_RTC_EXTI_CLEAR_FLAG #endif @@ -3174,14 +3489,14 @@ #define SDIO_IRQHandler SDMMC1_IRQHandler #endif -#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) +#if defined(STM32F7) || defined(STM32F4) || defined(STM32F2) || defined(STM32L4) || defined(STM32H7) #define HAL_SD_CardCIDTypedef HAL_SD_CardCIDTypeDef #define HAL_SD_CardCSDTypedef HAL_SD_CardCSDTypeDef #define HAL_SD_CardStatusTypedef HAL_SD_CardStatusTypeDef #define HAL_SD_CardStateTypedef HAL_SD_CardStateTypeDef #endif -#if defined(STM32H7) +#if defined(STM32H7) || defined(STM32L5) #define HAL_MMCEx_Read_DMADoubleBuffer0CpltCallback HAL_MMCEx_Read_DMADoubleBuf0CpltCallback #define HAL_MMCEx_Read_DMADoubleBuffer1CpltCallback HAL_MMCEx_Read_DMADoubleBuf1CpltCallback #define HAL_MMCEx_Write_DMADoubleBuffer0CpltCallback HAL_MMCEx_Write_DMADoubleBuf0CpltCallback @@ -3421,18 +3736,28 @@ /** @defgroup HAL_HRTIM_Aliased_Functions HAL HRTIM Aliased Functions maintained for legacy purpose * @{ */ -#if defined (STM32H7) || defined (STM32F3) -#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT -#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA -#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart -#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT -#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA -#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop +#if defined (STM32H7) || defined (STM32G4) || defined (STM32F3) +#define HAL_HRTIM_WaveformCounterStart_IT HAL_HRTIM_WaveformCountStart_IT +#define HAL_HRTIM_WaveformCounterStart_DMA HAL_HRTIM_WaveformCountStart_DMA +#define HAL_HRTIM_WaveformCounterStart HAL_HRTIM_WaveformCountStart +#define HAL_HRTIM_WaveformCounterStop_IT HAL_HRTIM_WaveformCountStop_IT +#define HAL_HRTIM_WaveformCounterStop_DMA HAL_HRTIM_WaveformCountStop_DMA +#define HAL_HRTIM_WaveformCounterStop HAL_HRTIM_WaveformCountStop #endif /** * @} */ +/** @defgroup HAL_QSPI_Aliased_Macros HAL QSPI Aliased Macros maintained for legacy purpose + * @{ + */ +#if defined (STM32L4) || defined (STM32F4) || defined (STM32F7) +#define HAL_QPSI_TIMEOUT_DEFAULT_VALUE HAL_QSPI_TIMEOUT_DEFAULT_VALUE +#endif /* STM32L4 || STM32F4 || STM32F7 */ +/** + * @} + */ + /** @defgroup HAL_PPP_Aliased_Macros HAL PPP Aliased Macros maintained for legacy purpose * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h index bf82a38e..c9f137c1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_exti.h @@ -18,8 +18,8 @@ */ /* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32F7xx_HAL_EXTI_H -#define __STM32F7xx_HAL_EXTI_H +#ifndef STM32F7xx_HAL_EXTI_H +#define STM32F7xx_HAL_EXTI_H #ifdef __cplusplus extern "C" { @@ -38,14 +38,13 @@ extern "C" { */ /* Exported types ------------------------------------------------------------*/ + /** @defgroup EXTI_Exported_Types EXTI Exported Types * @{ */ typedef enum { - HAL_EXTI_COMMON_CB_ID = 0x00U, - HAL_EXTI_RISING_CB_ID = 0x01U, - HAL_EXTI_FALLING_CB_ID = 0x02U, + HAL_EXTI_COMMON_CB_ID = 0x00U } EXTI_CallbackIDTypeDef; /** @@ -68,6 +67,9 @@ typedef struct This parameter can be a combination of @ref EXTI_Mode */ uint32_t Trigger; /*!< The Exti Trigger to be configured. This parameter can be a value of @ref EXTI_Trigger */ + uint32_t GPIOSel; /*!< The Exti GPIO multiplexer selection to be configured. + This parameter is only possible for line 0 to 15. It + can be a value of @ref EXTI_GPIOSel */ } EXTI_ConfigTypeDef; /** @@ -82,48 +84,36 @@ typedef struct /** @defgroup EXTI_Line EXTI Line * @{ */ -#define EXTI_LINE_0 EXTI_IMR_IM0 /*!< External interrupt line 0 */ -#define EXTI_LINE_1 EXTI_IMR_IM1 /*!< External interrupt line 1 */ -#define EXTI_LINE_2 EXTI_IMR_IM2 /*!< External interrupt line 2 */ -#define EXTI_LINE_3 EXTI_IMR_IM3 /*!< External interrupt line 3 */ -#define EXTI_LINE_4 EXTI_IMR_IM4 /*!< External interrupt line 4 */ -#define EXTI_LINE_5 EXTI_IMR_IM5 /*!< External interrupt line 5 */ -#define EXTI_LINE_6 EXTI_IMR_IM6 /*!< External interrupt line 6 */ -#define EXTI_LINE_7 EXTI_IMR_IM7 /*!< External interrupt line 7 */ -#define EXTI_LINE_8 EXTI_IMR_IM8 /*!< External interrupt line 8 */ -#define EXTI_LINE_9 EXTI_IMR_IM9 /*!< External interrupt line 9 */ -#define EXTI_LINE_10 EXTI_IMR_IM10 /*!< External interrupt line 10 */ -#define EXTI_LINE_11 EXTI_IMR_IM11 /*!< External interrupt line 11 */ -#define EXTI_LINE_12 EXTI_IMR_IM12 /*!< External interrupt line 12 */ -#define EXTI_LINE_13 EXTI_IMR_IM13 /*!< External interrupt line 13 */ -#define EXTI_LINE_14 EXTI_IMR_IM14 /*!< External interrupt line 14 */ -#define EXTI_LINE_15 EXTI_IMR_IM15 /*!< External interrupt line 15 */ -#if defined(EXTI_IMR_IM16) -#define EXTI_LINE_16 EXTI_IMR_IM16 /*!< External interrupt line 16 Connected to the PVD Output */ -#endif /* EXTI_IMR_IM16 */ -#if defined(EXTI_IMR_IM17) -#define EXTI_LINE_17 EXTI_IMR_IM17 /*!< External interrupt line 17 Connected to the RTC Alarm event */ -#endif /* EXTI_IMR_IM17 */ -#if defined(EXTI_IMR_IM18) -#define EXTI_LINE_18 EXTI_IMR_IM18 /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ -#endif /* EXTI_IMR_IM18 */ -#if defined(EXTI_IMR_IM19) -#define EXTI_LINE_19 EXTI_IMR_IM19 /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ -#endif /* EXTI_IMR_IM19 */ -#if defined(EXTI_IMR_IM20) -#define EXTI_LINE_20 EXTI_IMR_IM20 /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ -#endif /* EXTI_IMR_IM20 */ -#if defined(EXTI_IMR_IM21) -#define EXTI_LINE_21 EXTI_IMR_IM21 /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ -#endif /* EXTI_IMR_IM21 */ -#if defined(EXTI_IMR_IM22) -#define EXTI_LINE_22 EXTI_IMR_IM22 /*!< External interrupt line 22 Connected to the RTC Wakeup event */ -#endif /* EXTI_IMR_IM22 */ -#if defined(EXTI_IMR_IM23) -#define EXTI_LINE_23 EXTI_IMR_IM23 /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ -#endif /* EXTI_IMR_IM23 */ +#define EXTI_LINE_0 (EXTI_GPIO | 0x00u) /*!< External interrupt line 0 */ +#define EXTI_LINE_1 (EXTI_GPIO | 0x01u) /*!< External interrupt line 1 */ +#define EXTI_LINE_2 (EXTI_GPIO | 0x02u) /*!< External interrupt line 2 */ +#define EXTI_LINE_3 (EXTI_GPIO | 0x03u) /*!< External interrupt line 3 */ +#define EXTI_LINE_4 (EXTI_GPIO | 0x04u) /*!< External interrupt line 4 */ +#define EXTI_LINE_5 (EXTI_GPIO | 0x05u) /*!< External interrupt line 5 */ +#define EXTI_LINE_6 (EXTI_GPIO | 0x06u) /*!< External interrupt line 6 */ +#define EXTI_LINE_7 (EXTI_GPIO | 0x07u) /*!< External interrupt line 7 */ +#define EXTI_LINE_8 (EXTI_GPIO | 0x08u) /*!< External interrupt line 8 */ +#define EXTI_LINE_9 (EXTI_GPIO | 0x09u) /*!< External interrupt line 9 */ +#define EXTI_LINE_10 (EXTI_GPIO | 0x0Au) /*!< External interrupt line 10 */ +#define EXTI_LINE_11 (EXTI_GPIO | 0x0Bu) /*!< External interrupt line 11 */ +#define EXTI_LINE_12 (EXTI_GPIO | 0x0Cu) /*!< External interrupt line 12 */ +#define EXTI_LINE_13 (EXTI_GPIO | 0x0Du) /*!< External interrupt line 13 */ +#define EXTI_LINE_14 (EXTI_GPIO | 0x0Eu) /*!< External interrupt line 14 */ +#define EXTI_LINE_15 (EXTI_GPIO | 0x0Fu) /*!< External interrupt line 15 */ +#define EXTI_LINE_16 (EXTI_CONFIG | 0x10u) /*!< External interrupt line 16 Connected to the PVD Output */ +#define EXTI_LINE_17 (EXTI_CONFIG | 0x11u) /*!< External interrupt line 17 Connected to the RTC Alarm event */ +#define EXTI_LINE_18 (EXTI_CONFIG | 0x12u) /*!< External interrupt line 18 Connected to the USB OTG FS Wakeup from suspend event */ +#if defined(ETH) +#define EXTI_LINE_19 (EXTI_CONFIG | 0x13u) /*!< External interrupt line 19 Connected to the Ethernet Wakeup event */ +#else +#define EXTI_LINE_19 (EXTI_RESERVED | 0x13u) /*!< No interrupt supported in this line */ +#endif /* ETH */ +#define EXTI_LINE_20 (EXTI_CONFIG | 0x14u) /*!< External interrupt line 20 Connected to the USB OTG HS (configured in FS) Wakeup event */ +#define EXTI_LINE_21 (EXTI_CONFIG | 0x15u) /*!< External interrupt line 21 Connected to the RTC Tamper and Time Stamp events */ +#define EXTI_LINE_22 (EXTI_CONFIG | 0x16u) /*!< External interrupt line 22 Connected to the RTC Wakeup event */ +#define EXTI_LINE_23 (EXTI_CONFIG | 0x17u) /*!< External interrupt line 23 Connected to the LPTIM Wakeup event */ #if defined(EXTI_IMR_IM24) -#define EXTI_LINE_24 EXTI_IMR_IM24 /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ +#define EXTI_LINE_24 (EXTI_CONFIG | 0x18u) /*!< External interrupt line 24 Connected to the MDIO Slave global Interrupt Wakeup event */ #endif /* EXTI_IMR_IM24 */ /** * @} @@ -142,6 +132,7 @@ typedef struct /** @defgroup EXTI_Trigger EXTI Trigger * @{ */ + #define EXTI_TRIGGER_NONE 0x00000000u #define EXTI_TRIGGER_RISING 0x00000001u #define EXTI_TRIGGER_FALLING 0x00000002u @@ -150,6 +141,24 @@ typedef struct * @} */ +/** @defgroup EXTI_GPIOSel EXTI GPIOSel + * @brief + * @{ + */ +#define EXTI_GPIOA 0x00000000u +#define EXTI_GPIOB 0x00000001u +#define EXTI_GPIOC 0x00000002u +#define EXTI_GPIOD 0x00000003u +#define EXTI_GPIOE 0x00000004u +#define EXTI_GPIOF 0x00000005u +#define EXTI_GPIOG 0x00000006u +#define EXTI_GPIOH 0x00000007u +#define EXTI_GPIOI 0x00000008u +#define EXTI_GPIOJ 0x00000009u +#if defined (GPIOK) +#define EXTI_GPIOK 0x0000000Au +#endif /* GPIOK */ + /** * @} */ @@ -167,6 +176,20 @@ typedef struct /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ +/** + * @brief EXTI Line property definition + */ +#define EXTI_PROPERTY_SHIFT 24u +#define EXTI_CONFIG (0x02uL << EXTI_PROPERTY_SHIFT) +#define EXTI_GPIO ((0x04uL << EXTI_PROPERTY_SHIFT) | EXTI_CONFIG) +#define EXTI_RESERVED (0x08uL << EXTI_PROPERTY_SHIFT) +#define EXTI_PROPERTY_MASK (EXTI_CONFIG | EXTI_GPIO) + +/** + * @brief EXTI bit usage + */ +#define EXTI_PIN_MASK 0x0000001Fu + /** * @brief EXTI Mask for interrupt & event mode */ @@ -175,12 +198,17 @@ typedef struct /** * @brief EXTI Mask for trigger possibilities */ -#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING | EXTI_TRIGGER_RISING_FALLING) +#define EXTI_TRIGGER_MASK (EXTI_TRIGGER_RISING | EXTI_TRIGGER_FALLING) /** * @brief EXTI Line number */ +#if defined(EXTI_IMR_IM24) #define EXTI_LINE_NB 25u +#else +#define EXTI_LINE_NB 24u +#endif /* EXTI_IMR_IM24 */ + /** * @} @@ -190,16 +218,47 @@ typedef struct /** @defgroup EXTI_Private_Macros EXTI Private Macros * @{ */ -#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~EXTI_IMR_IM) == 0x00U) && (__LINE__)) +#define IS_EXTI_LINE(__LINE__) ((((__LINE__) & ~(EXTI_PROPERTY_MASK | EXTI_PIN_MASK)) == 0x00u) && \ + ((((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_CONFIG) || \ + (((__LINE__) & EXTI_PROPERTY_MASK) == EXTI_GPIO)) && \ + (((__LINE__) & EXTI_PIN_MASK) < EXTI_LINE_NB)) -#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & ~EXTI_MODE_MASK) == 0x00U)) +#define IS_EXTI_MODE(__LINE__) ((((__LINE__) & EXTI_MODE_MASK) != 0x00u) && \ + (((__LINE__) & ~EXTI_MODE_MASK) == 0x00u)) -#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00U) +#define IS_EXTI_TRIGGER(__LINE__) (((__LINE__) & ~EXTI_TRIGGER_MASK) == 0x00u) #define IS_EXTI_PENDING_EDGE(__LINE__) (((__LINE__) == EXTI_TRIGGER_FALLING) || \ ((__LINE__) == EXTI_TRIGGER_RISING) || \ ((__LINE__) == EXTI_TRIGGER_RISING_FALLING)) +#define IS_EXTI_CONFIG_LINE(__LINE__) (((__LINE__) & EXTI_CONFIG) != 0x00u) + +#if defined (GPIOK) +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ) || \ + ((__PORT__) == EXTI_GPIOK)) +#else +#define IS_EXTI_GPIO_PORT(__PORT__) (((__PORT__) == EXTI_GPIOA) || \ + ((__PORT__) == EXTI_GPIOB) || \ + ((__PORT__) == EXTI_GPIOC) || \ + ((__PORT__) == EXTI_GPIOD) || \ + ((__PORT__) == EXTI_GPIOE) || \ + ((__PORT__) == EXTI_GPIOF) || \ + ((__PORT__) == EXTI_GPIOG) || \ + ((__PORT__) == EXTI_GPIOH) || \ + ((__PORT__) == EXTI_GPIOI) || \ + ((__PORT__) == EXTI_GPIOJ)) +#endif /* GPIOK */ + #define IS_EXTI_GPIO_PIN(__PIN__) ((__PIN__) < 16U) /** * @} @@ -255,6 +314,6 @@ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti); } #endif -#endif /* __STM32F7xx_HAL_EXTI_H */ +#endif /* STM32F7xx_HAL_EXTI_H */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h index 3d9de6e2..08e0acb2 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_gpio.h @@ -262,7 +262,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); * @{ */ #define IS_GPIO_PIN_ACTION(ACTION) (((ACTION) == GPIO_PIN_RESET) || ((ACTION) == GPIO_PIN_SET)) -#define IS_GPIO_PIN(__PIN__) ((((__PIN__) & GPIO_PIN_MASK) != (uint32_t)0x00)) +#define IS_GPIO_PIN(__PIN__) ((((uint32_t)(__PIN__) & GPIO_PIN_MASK) != 0x00U)) #define IS_GPIO_MODE(MODE) (((MODE) == GPIO_MODE_INPUT) ||\ ((MODE) == GPIO_MODE_OUTPUT_PP) ||\ ((MODE) == GPIO_MODE_OUTPUT_OD) ||\ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h index d5d75314..83037894 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_i2c_ex.h @@ -167,6 +167,9 @@ void HAL_I2CEx_DisableFastModePlus(uint32_t ConfigFastModePlus); (((__CONFIG__) & I2C_FASTMODEPLUS_PB9) == I2C_FASTMODEPLUS_PB9) || \ (((__CONFIG__) & I2C_FASTMODEPLUS_I2C1) == I2C_FASTMODEPLUS_I2C1)) #endif /* SYSCFG_PMC_I2C1_FMP && SYSCFG_PMC_I2C2_FMP && SYSCFG_PMC_I2C3_FMP && SYSCFG_PMC_I2C4_FMP */ + + + /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h index 6a29ae50..ab067a59 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim.h @@ -167,7 +167,7 @@ typedef struct This parameter can be a value of @ref TIM_Encoder_Mode */ uint32_t IC1Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC1Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -179,7 +179,7 @@ typedef struct This parameter can be a number between Min_Data = 0x0 and Max_Data = 0xF */ uint32_t IC2Polarity; /*!< Specifies the active edge of the input signal. - This parameter can be a value of @ref TIM_Input_Capture_Polarity */ + This parameter can be a value of @ref TIM_Encoder_Input_Polarity */ uint32_t IC2Selection; /*!< Specifies the input. This parameter can be a value of @ref TIM_Input_Capture_Selection */ @@ -235,7 +235,12 @@ typedef struct uint32_t MasterOutputTrigger2; /*!< Trigger output2 (TRGO2) selection This parameter can be a value of @ref TIM_Master_Mode_Selection_2 */ uint32_t MasterSlaveMode; /*!< Master/slave mode selection - This parameter can be a value of @ref TIM_Master_Slave_Mode */ + This parameter can be a value of @ref TIM_Master_Slave_Mode + @note When the Master/slave mode is enabled, the effect of + an event on the trigger input (TRGI) is delayed to allow a + perfect synchronization between the current timer and its + slaves (through TRGO). It is not mandatory in case of timer + synchronization mode. */ } TIM_MasterConfigTypeDef; /** @@ -518,6 +523,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Update_Interrupt_Flag_Remap TIM Update Interrupt Flag Remap + * @{ + */ +#define TIM_UIFREMAP_DISABLE 0x00000000U /*!< Update interrupt flag remap disabled */ +#define TIM_UIFREMAP_ENABLE TIM_CR1_UIFREMAP /*!< Update interrupt flag remap enabled */ +/** + * @} + */ + /** @defgroup TIM_ClockDivision TIM Clock Division * @{ */ @@ -611,6 +625,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @} */ +/** @defgroup TIM_Encoder_Input_Polarity TIM Encoder Input Polarity + * @{ + */ +#define TIM_ENCODERINPUTPOLARITY_RISING TIM_INPUTCHANNELPOLARITY_RISING /*!< Encoder input with rising edge polarity */ +#define TIM_ENCODERINPUTPOLARITY_FALLING TIM_INPUTCHANNELPOLARITY_FALLING /*!< Encoder input with falling edge polarity */ +/** + * @} + */ + /** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection * @{ */ @@ -1119,15 +1142,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @retval None */ #define __HAL_TIM_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->CR1 &= ~(TIM_CR1_CEN); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1136,15 +1159,15 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @note The Main Output Enable of a timer instance is disabled only if all the CCx and CCxN channels have been disabled */ #define __HAL_TIM_MOE_DISABLE(__HANDLE__) \ - do { \ - if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ - { \ - if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ - { \ - (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ - } \ - } \ - } while(0) + do { \ + if (((__HANDLE__)->Instance->CCER & TIM_CCER_CCxE_MASK) == 0UL) \ + { \ + if(((__HANDLE__)->Instance->CCER & TIM_CCER_CCxNE_MASK) == 0UL) \ + { \ + (__HANDLE__)->Instance->BDTR &= ~(TIM_BDTR_MOE); \ + } \ + } \ + } while(0) /** * @brief Disable the TIM main Output. @@ -1279,7 +1302,8 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to * @arg TIM_IT_BREAK: Break interrupt * @retval The state of TIM_IT (SET or RESET). */ -#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET) +#define __HAL_TIM_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->DIER & (__INTERRUPT__)) \ + == (__INTERRUPT__)) ? SET : RESET) /** @brief Clear the TIM interrupt pending bits. * @param __HANDLE__ TIM handle @@ -1297,6 +1321,31 @@ typedef void (*pTIM_CallbackTypeDef)(TIM_HandleTypeDef *htim); /*!< pointer to */ #define __HAL_TIM_CLEAR_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->SR = ~(__INTERRUPT__)) +/** + * @brief Force a continuous copy of the update interrupt flag (UIF) into the timer counter register (bit 31). + * @note This allows both the counter value and a potential roll-over condition signalled by the UIFCPY flag to be read in an atomic way. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_ENABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 |= TIM_CR1_UIFREMAP)) + +/** + * @brief Disable update interrupt flag (UIF) remapping. + * @param __HANDLE__ TIM handle. + * @retval None +mode. + */ +#define __HAL_TIM_UIFREMAP_DISABLE(__HANDLE__) (((__HANDLE__)->Instance->CR1 &= ~TIM_CR1_UIFREMAP)) + +/** + * @brief Get update interrupt flag (UIF) copy status. + * @param __COUNTER__ Counter value. + * @retval The state of UIFCPY (TRUE or FALSE). +mode. + */ +#define __HAL_TIM_GET_UIFCPY(__COUNTER__) (((__COUNTER__) & (TIM_CNT_UIFCPY)) == (TIM_CNT_UIFCPY)) + /** * @brief Indicates whether or not the TIM Counter is used as downcounter. * @param __HANDLE__ TIM handle. @@ -1316,6 +1365,8 @@ mode. /** * @brief Set the TIM Counter Register value on runtime. + * Note Please check if the bit 31 of CNT register is used as UIF copy or not, this may affect the counter range in case of 32 bits counter TIM instance. + * Bit 31 of CNT can be enabled/disabled using __HAL_TIM_UIFREMAP_ENABLE()/__HAL_TIM_UIFREMAP_DISABLE() macros. * @param __HANDLE__ TIM handle. * @param __COUNTER__ specifies the Counter register new value. * @retval None @@ -1327,8 +1378,7 @@ mode. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer counter register (TIMx_CNT) */ -#define __HAL_TIM_GET_COUNTER(__HANDLE__) \ - ((__HANDLE__)->Instance->CNT) +#define __HAL_TIM_GET_COUNTER(__HANDLE__) ((__HANDLE__)->Instance->CNT) /** * @brief Set the TIM Autoreload Register value on runtime without calling another time any Init function. @@ -1337,18 +1387,17 @@ mode. * @retval None */ #define __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__) \ - do{ \ - (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ - (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->ARR = (__AUTORELOAD__); \ + (__HANDLE__)->Init.Period = (__AUTORELOAD__); \ + } while(0) /** * @brief Get the TIM Autoreload Register value on runtime. * @param __HANDLE__ TIM handle. * @retval 16-bit or 32-bit value of the timer auto-reload register(TIMx_ARR) */ -#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) \ - ((__HANDLE__)->Instance->ARR) +#define __HAL_TIM_GET_AUTORELOAD(__HANDLE__) ((__HANDLE__)->Instance->ARR) /** * @brief Set the TIM Clock Division value on runtime without calling another time any Init function. @@ -1361,11 +1410,11 @@ mode. * @retval None */ #define __HAL_TIM_SET_CLOCKDIVISION(__HANDLE__, __CKD__) \ - do{ \ - (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ - (__HANDLE__)->Instance->CR1 |= (__CKD__); \ - (__HANDLE__)->Init.ClockDivision = (__CKD__); \ - } while(0) + do{ \ + (__HANDLE__)->Instance->CR1 &= (~TIM_CR1_CKD); \ + (__HANDLE__)->Instance->CR1 |= (__CKD__); \ + (__HANDLE__)->Init.ClockDivision = (__CKD__); \ + } while(0) /** * @brief Get the TIM Clock Division value on runtime. @@ -1375,8 +1424,7 @@ mode. * @arg TIM_CLOCKDIVISION_DIV2: tDTS=2*tCK_INT * @arg TIM_CLOCKDIVISION_DIV4: tDTS=4*tCK_INT */ -#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) +#define __HAL_TIM_GET_CLOCKDIVISION(__HANDLE__) ((__HANDLE__)->Instance->CR1 & TIM_CR1_CKD) /** * @brief Set the TIM Input Capture prescaler on runtime without calling another time HAL_TIM_IC_ConfigChannel() function. @@ -1396,10 +1444,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_ICPRESCALER(__HANDLE__, __CHANNEL__, __ICPSC__) \ - do{ \ - TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ - } while(0) + do{ \ + TIM_RESET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_ICPRESCALERVALUE((__HANDLE__), (__CHANNEL__), (__ICPSC__)); \ + } while(0) /** * @brief Get the TIM Input Capture prescaler on runtime. @@ -1437,12 +1485,12 @@ mode. * @retval None */ #define __HAL_TIM_SET_COMPARE(__HANDLE__, __CHANNEL__, __COMPARE__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ - ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4 = (__COMPARE__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5 = (__COMPARE__)) :\ + ((__HANDLE__)->Instance->CCR6 = (__COMPARE__))) /** * @brief Get the TIM Capture Compare Register value on runtime. @@ -1458,12 +1506,12 @@ mode. * @retval 16-bit or 32-bit value of the capture/compare register (TIMx_CCRy) */ #define __HAL_TIM_GET_COMPARE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ - ((__HANDLE__)->Instance->CCR6)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCR1) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCR2) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCR3) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCR4) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCR5) :\ + ((__HANDLE__)->Instance->CCR6)) /** * @brief Set the TIM Output compare preload. @@ -1479,12 +1527,12 @@ mode. * @retval None */ #define __HAL_TIM_ENABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6PE)) /** * @brief Reset the TIM Output compare preload. @@ -1500,12 +1548,62 @@ mode. * @retval None */ #define __HAL_TIM_DISABLE_OCxPRELOAD(__HANDLE__, __CHANNEL__) \ - (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC1PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_OC2PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC3PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_OC4PE) :\ - ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC5PE) :\ - ((__HANDLE__)->Instance->CCMR3 &= (uint16_t)~TIM_CCMR3_OC6PE)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4PE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5PE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6PE)) + +/** + * @brief Enable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is enabled an active edge on the trigger input acts + * like a compare match on CCx output. Delay to sample the trigger + * input and to activate CCx output is reduced to 3 clock cycles. + * @note Fast mode acts only if the channel is configured in PWM1 or PWM2 mode. + * @retval None + */ +#define __HAL_TIM_ENABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 |= TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 |= TIM_CCMR3_OC6FE)) + +/** + * @brief Disable fast mode for a given channel. + * @param __HANDLE__ TIM handle. + * @param __CHANNEL__ TIM Channels to be configured. + * This parameter can be one of the following values: + * @arg TIM_CHANNEL_1: TIM Channel 1 selected + * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @arg TIM_CHANNEL_3: TIM Channel 3 selected + * @arg TIM_CHANNEL_4: TIM Channel 4 selected + * @arg TIM_CHANNEL_5: TIM Channel 5 selected + * @arg TIM_CHANNEL_6: TIM Channel 6 selected + * @note When fast mode is disabled CCx output behaves normally depending + * on counter and CCRx values even when the trigger is ON. The minimum + * delay to activate CCx output when an active edge occurs on the + * trigger input is 5 clock cycles. + * @retval None + */ +#define __HAL_TIM_DISABLE_OCxFAST(__HANDLE__, __CHANNEL__) \ + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC1FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_OC2FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC3FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_4) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_OC4FE) :\ + ((__CHANNEL__) == TIM_CHANNEL_5) ? ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC5FE) :\ + ((__HANDLE__)->Instance->CCMR3 &= ~TIM_CCMR3_OC6FE)) /** * @brief Set the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1515,8 +1613,7 @@ mode. * enabled) * @retval None */ -#define __HAL_TIM_URS_ENABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) +#define __HAL_TIM_URS_ENABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1|= TIM_CR1_URS) /** * @brief Reset the Update Request Source (URS) bit of the TIMx_CR1 register. @@ -1529,8 +1626,7 @@ mode. * _ Update generation through the slave mode controller * @retval None */ -#define __HAL_TIM_URS_DISABLE(__HANDLE__) \ - ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) +#define __HAL_TIM_URS_DISABLE(__HANDLE__) ((__HANDLE__)->Instance->CR1&=~TIM_CR1_URS) /** * @brief Set the TIM Capture x input polarity on runtime. @@ -1548,10 +1644,10 @@ mode. * @retval None */ #define __HAL_TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ - do{ \ - TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ - TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ - }while(0) + do{ \ + TIM_RESET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__)); \ + TIM_SET_CAPTUREPOLARITY((__HANDLE__), (__CHANNEL__), (__POLARITY__)); \ + }while(0) /** * @} @@ -1579,29 +1675,29 @@ mode. ((__MODE__) == TIM_CLEARINPUTSOURCE_ETR)) #if defined(TIM_AF1_BKINE)&&defined(TIM_AF2_BKINE) -#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ - ((__BASE__) == TIM_DMABASE_CR2) || \ - ((__BASE__) == TIM_DMABASE_SMCR) || \ - ((__BASE__) == TIM_DMABASE_DIER) || \ - ((__BASE__) == TIM_DMABASE_SR) || \ - ((__BASE__) == TIM_DMABASE_EGR) || \ - ((__BASE__) == TIM_DMABASE_CCMR1) || \ - ((__BASE__) == TIM_DMABASE_CCMR2) || \ - ((__BASE__) == TIM_DMABASE_CCER) || \ - ((__BASE__) == TIM_DMABASE_CNT) || \ - ((__BASE__) == TIM_DMABASE_PSC) || \ - ((__BASE__) == TIM_DMABASE_ARR) || \ - ((__BASE__) == TIM_DMABASE_RCR) || \ - ((__BASE__) == TIM_DMABASE_CCR1) || \ - ((__BASE__) == TIM_DMABASE_CCR2) || \ - ((__BASE__) == TIM_DMABASE_CCR3) || \ - ((__BASE__) == TIM_DMABASE_CCR4) || \ - ((__BASE__) == TIM_DMABASE_BDTR) || \ - ((__BASE__) == TIM_DMABASE_OR) || \ - ((__BASE__) == TIM_DMABASE_CCMR3) || \ - ((__BASE__) == TIM_DMABASE_CCR5) || \ - ((__BASE__) == TIM_DMABASE_CCR6) || \ - ((__BASE__) == TIM_DMABASE_AF1) || \ +#define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ + ((__BASE__) == TIM_DMABASE_CR2) || \ + ((__BASE__) == TIM_DMABASE_SMCR) || \ + ((__BASE__) == TIM_DMABASE_DIER) || \ + ((__BASE__) == TIM_DMABASE_SR) || \ + ((__BASE__) == TIM_DMABASE_EGR) || \ + ((__BASE__) == TIM_DMABASE_CCMR1) || \ + ((__BASE__) == TIM_DMABASE_CCMR2) || \ + ((__BASE__) == TIM_DMABASE_CCER) || \ + ((__BASE__) == TIM_DMABASE_CNT) || \ + ((__BASE__) == TIM_DMABASE_PSC) || \ + ((__BASE__) == TIM_DMABASE_ARR) || \ + ((__BASE__) == TIM_DMABASE_RCR) || \ + ((__BASE__) == TIM_DMABASE_CCR1) || \ + ((__BASE__) == TIM_DMABASE_CCR2) || \ + ((__BASE__) == TIM_DMABASE_CCR3) || \ + ((__BASE__) == TIM_DMABASE_CCR4) || \ + ((__BASE__) == TIM_DMABASE_BDTR) || \ + ((__BASE__) == TIM_DMABASE_OR) || \ + ((__BASE__) == TIM_DMABASE_CCMR3) || \ + ((__BASE__) == TIM_DMABASE_CCR5) || \ + ((__BASE__) == TIM_DMABASE_CCR6) || \ + ((__BASE__) == TIM_DMABASE_AF1) || \ ((__BASE__) == TIM_DMABASE_AF2)) #else #define IS_TIM_DMA_BASE(__BASE__) (((__BASE__) == TIM_DMABASE_CR1) || \ @@ -1636,6 +1732,9 @@ mode. ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED2) || \ ((__MODE__) == TIM_COUNTERMODE_CENTERALIGNED3)) +#define IS_TIM_UIFREMAP_MODE(__MODE__) (((__MODE__) == TIM_UIFREMAP_DISABLE) || \ + ((__MODE__) == TIM_UIFREMAP_ENALE)) + #define IS_TIM_CLOCKDIVISION_DIV(__DIV__) (((__DIV__) == TIM_CLOCKDIVISION_DIV1) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV2) || \ ((__DIV__) == TIM_CLOCKDIVISION_DIV4)) @@ -1658,6 +1757,9 @@ mode. #define IS_TIM_OCNIDLE_STATE(__STATE__) (((__STATE__) == TIM_OCNIDLESTATE_SET) || \ ((__STATE__) == TIM_OCNIDLESTATE_RESET)) +#define IS_TIM_ENCODERINPUT_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_RISING) || \ + ((__POLARITY__) == TIM_ENCODERINPUTPOLARITY_FALLING)) + #define IS_TIM_IC_POLARITY(__POLARITY__) (((__POLARITY__) == TIM_ICPOLARITY_RISING) || \ ((__POLARITY__) == TIM_ICPOLARITY_FALLING) || \ ((__POLARITY__) == TIM_ICPOLARITY_BOTHEDGE)) @@ -1876,28 +1978,28 @@ mode. ((__TRIGGER__) == TIM_SLAVEMODE_COMBINED_RESETTRIGGER)) #define TIM_SET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__, __ICPSC__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ - ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 |= (__ICPSC__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 |= ((__ICPSC__) << 8U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 |= (__ICPSC__)) :\ + ((__HANDLE__)->Instance->CCMR2 |= ((__ICPSC__) << 8U))) #define TIM_RESET_ICPRESCALERVALUE(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC1PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= (uint16_t)~TIM_CCMR1_IC2PSC) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC3PSC) :\ - ((__HANDLE__)->Instance->CCMR2 &= (uint16_t)~TIM_CCMR2_IC4PSC)) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC1PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCMR1 &= ~TIM_CCMR1_IC2PSC) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC3PSC) :\ + ((__HANDLE__)->Instance->CCMR2 &= ~TIM_CCMR2_IC4PSC)) #define TIM_SET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__, __POLARITY__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ - ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER |= (__POLARITY__)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 4U)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER |= ((__POLARITY__) << 8U)) :\ + ((__HANDLE__)->Instance->CCER |= (((__POLARITY__) << 12U)))) #define TIM_RESET_CAPTUREPOLARITY(__HANDLE__, __CHANNEL__) \ -(((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ - ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ - ((__HANDLE__)->Instance->CCER &= (uint16_t)~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) + (((__CHANNEL__) == TIM_CHANNEL_1) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC1P | TIM_CCER_CC1NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_2) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC2P | TIM_CCER_CC2NP)) :\ + ((__CHANNEL__) == TIM_CHANNEL_3) ? ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC3P | TIM_CCER_CC3NP)) :\ + ((__HANDLE__)->Instance->CCER &= ~(TIM_CCER_CC4P | TIM_CCER_CC4NP))) /** * @} @@ -2035,7 +2137,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel); /* Non-Blocking mode: DMA */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length); +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length); HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel); /** * @} @@ -2059,17 +2162,19 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim); HAL_StatusTypeDef HAL_TIM_OC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OC_InitTypeDef *sConfig, uint32_t Channel); HAL_StatusTypeDef HAL_TIM_IC_ConfigChannel(TIM_HandleTypeDef *htim, TIM_IC_InitTypeDef *sConfig, uint32_t Channel); -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel); -HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, uint32_t Channel); +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel); +HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, TIM_ClearInputConfigTypeDef *sClearInputConfig, + uint32_t Channel); HAL_StatusTypeDef HAL_TIM_ConfigClockSource(TIM_HandleTypeDef *htim, TIM_ClockConfigTypeDef *sClockSourceConfig); HAL_StatusTypeDef HAL_TIM_ConfigTI1Input(TIM_HandleTypeDef *htim, uint32_t TI1_Selection); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, TIM_SlaveConfigTypeDef *sSlaveConfig); -HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, \ - uint32_t *BurstBuffer, uint32_t BurstLength); +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength); HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStop(TIM_HandleTypeDef *htim, uint32_t BurstRequestSrc); HAL_StatusTypeDef HAL_TIM_GenerateEvent(TIM_HandleTypeDef *htim, uint32_t EventSource); uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -2095,7 +2200,8 @@ void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_TIM_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ @@ -2125,8 +2231,8 @@ HAL_TIM_StateTypeDef HAL_TIM_Encoder_GetState(TIM_HandleTypeDef *htim); /* Private functions----------------------------------------------------------*/ /** @defgroup TIM_Private_Functions TIM Private Functions -* @{ -*/ + * @{ + */ void TIM_Base_SetConfig(TIM_TypeDef *TIMx, TIM_Base_InitTypeDef *Structure); void TIM_TI1_SetConfig(TIM_TypeDef *TIMx, uint32_t TIM_ICPolarity, uint32_t TIM_ICSelection, uint32_t TIM_ICFilter); void TIM_OC2_SetConfig(TIM_TypeDef *TIMx, TIM_OC_InitTypeDef *OC_Config); @@ -2145,8 +2251,8 @@ void TIM_ResetCallback(TIM_HandleTypeDef *htim); #endif /* USE_HAL_TIM_REGISTER_CALLBACKS */ /** -* @} -*/ + * @} + */ /* End of private functions --------------------------------------------------*/ /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h index 598f5c6e..b8d3472e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_tim_ex.h @@ -201,9 +201,9 @@ TIMEx_BreakInputConfigTypeDef; */ /** @addtogroup TIMEx_Exported_Functions_Group1 Extended Timer Hall Sensor functions - * @brief Timer Hall Sensor functions - * @{ - */ + * @brief Timer Hall Sensor functions + * @{ + */ /* Timer Hall Sensor functions **********************************************/ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Init(TIM_HandleTypeDef *htim, TIM_HallSensor_InitTypeDef *sConfig); HAL_StatusTypeDef HAL_TIMEx_HallSensor_DeInit(TIM_HandleTypeDef *htim); @@ -225,9 +225,9 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Stop_DMA(TIM_HandleTypeDef *htim); */ /** @addtogroup TIMEx_Exported_Functions_Group2 Extended Timer Complementary Output Compare functions - * @brief Timer Complementary Output Compare functions - * @{ - */ + * @brief Timer Complementary Output Compare functions + * @{ + */ /* Timer Complementary Output Compare functions *****************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OCN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -245,9 +245,9 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chann */ /** @addtogroup TIMEx_Exported_Functions_Group3 Extended Timer Complementary PWM functions - * @brief Timer Complementary PWM functions - * @{ - */ + * @brief Timer Complementary PWM functions + * @{ + */ /* Timer Complementary PWM functions ****************************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start(TIM_HandleTypeDef *htim, uint32_t Channel); @@ -264,9 +264,9 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Chan */ /** @addtogroup TIMEx_Exported_Functions_Group4 Extended Timer Complementary One Pulse functions - * @brief Timer Complementary One Pulse functions - * @{ - */ + * @brief Timer Complementary One Pulse functions + * @{ + */ /* Timer Complementary One Pulse functions **********************************/ /* Blocking mode: Polling */ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Start(TIM_HandleTypeDef *htim, uint32_t OutputChannel); @@ -280,17 +280,23 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t */ /** @addtogroup TIMEx_Exported_Functions_Group5 Extended Peripheral Control functions - * @brief Peripheral Control functions - * @{ - */ + * @brief Peripheral Control functions + * @{ + */ /* Extended Control functions ************************************************/ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource); -HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, TIM_MasterConfigTypeDef *sMasterConfig); -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource); +HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, + TIM_MasterConfigTypeDef *sMasterConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, + TIM_BreakDeadTimeConfigTypeDef *sBreakDeadTimeConfig); #if defined(TIM_BREAK_INPUT_SUPPORT) -HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); +HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, uint32_t BreakInput, + TIMEx_BreakInputConfigTypeDef *sBreakInputConfig); #endif /* TIM_BREAK_INPUT_SUPPORT */ HAL_StatusTypeDef HAL_TIMEx_GroupChannel5(TIM_HandleTypeDef *htim, uint32_t Channels); HAL_StatusTypeDef HAL_TIMEx_RemapConfig(TIM_HandleTypeDef *htim, uint32_t Remap); @@ -327,7 +333,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim); /* End of exported functions -------------------------------------------------*/ /* Private functions----------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @addtogroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ void TIMEx_DMACommutationCplt(DMA_HandleTypeDef *hdma); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h index 4209206e..473ff95e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart.h @@ -125,8 +125,6 @@ typedef struct This parameter can be a value of @ref UART_MSB_First. */ } UART_AdvFeatureInitTypeDef; - - /** * @brief HAL UART State definition * @note HAL UART State value is a combination of 2 different substates: gState and RxState (see @ref UART_State_Definition). @@ -206,10 +204,9 @@ typedef struct __UART_HandleTypeDef uint16_t Mask; /*!< UART Rx RDR register mask */ + void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - void (*RxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Rx IRQ handler */ - - void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ + void (*TxISR)(struct __UART_HandleTypeDef *huart); /*!< Function pointer on Tx IRQ handler */ DMA_HandleTypeDef *hdmatx; /*!< UART Tx DMA Handle parameters */ @@ -313,8 +310,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define HAL_UART_ERROR_FE ((uint32_t)0x00000004U) /*!< Frame error */ #define HAL_UART_ERROR_ORE ((uint32_t)0x00000008U) /*!< Overrun error */ #define HAL_UART_ERROR_DMA ((uint32_t)0x00000010U) /*!< DMA transfer error */ +#define HAL_UART_ERROR_RTO ((uint32_t)0x00000020U) /*!< Receiver Timeout error */ + #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000020U) /*!< Invalid Callback error */ +#define HAL_UART_ERROR_INVALID_CALLBACK ((uint32_t)0x00000040U) /*!< Invalid Callback error */ #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ /** * @} @@ -400,11 +399,11 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @} */ -/** @defgroup UART_Receiver_TimeOut UART Receiver TimeOut +/** @defgroup UART_Receiver_Timeout UART Receiver Timeout * @{ */ -#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART receiver timeout disable */ -#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART receiver timeout enable */ +#define UART_RECEIVER_TIMEOUT_DISABLE 0x00000000U /*!< UART Receiver Timeout disable */ +#define UART_RECEIVER_TIMEOUT_ENABLE USART_CR2_RTOEN /*!< UART Receiver Timeout enable */ /** * @} */ @@ -562,6 +561,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_Stop_Mode_Enable UART Advanced Feature Stop Mode Enable + * @{ + */ +#define UART_ADVFEATURE_STOPMODE_DISABLE 0x00000000U /*!< UART stop mode disable */ +#define UART_ADVFEATURE_STOPMODE_ENABLE USART_CR1_UESM /*!< UART stop mode enable */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_Mute_Mode UART Advanced Feature Mute Mode Enable * @{ @@ -579,6 +589,18 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer /** * @} */ +#if defined(USART_CR1_UESM) + +/** @defgroup UART_WakeUp_from_Stop_Selection UART WakeUp From Stop Selection + * @{ + */ +#define UART_WAKEUP_ON_ADDRESS 0x00000000U /*!< UART wake-up on address */ +#define UART_WAKEUP_ON_STARTBIT USART_CR3_WUS_1 /*!< UART wake-up on start bit */ +#define UART_WAKEUP_ON_READDATA_NONEMPTY USART_CR3_WUS /*!< UART wake-up on receive data register not empty or RXFIFO is not empty */ +/** + * @} + */ +#endif /* USART_CR1_UESM */ /** @defgroup UART_DriverEnable_Polarity UART DriverEnable Polarity * @{ @@ -626,13 +648,20 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * - 0xXXXX : Flag mask in the ISR register * @{ */ +#if defined(USART_ISR_REACK) +#define UART_FLAG_REACK USART_ISR_REACK /*!< UART receive enable acknowledge flag */ +#endif /* USART_ISR_REACK */ #define UART_FLAG_TEACK USART_ISR_TEACK /*!< UART transmit enable acknowledge flag */ +#if defined(USART_CR1_UESM) +#define UART_FLAG_WUF USART_ISR_WUF /*!< UART wake-up from stop mode flag */ +#endif /* USART_CR1_UESM */ #define UART_FLAG_RWU USART_ISR_RWU /*!< UART receiver wake-up from mute mode flag */ #define UART_FLAG_SBKF USART_ISR_SBKF /*!< UART send break flag */ #define UART_FLAG_CMF USART_ISR_CMF /*!< UART character match flag */ #define UART_FLAG_BUSY USART_ISR_BUSY /*!< UART busy flag */ #define UART_FLAG_ABRF USART_ISR_ABRF /*!< UART auto Baud rate flag */ #define UART_FLAG_ABRE USART_ISR_ABRE /*!< UART auto Baud rate error */ +#define UART_FLAG_RTOF USART_ISR_RTOF /*!< UART receiver timeout flag */ #define UART_FLAG_CTS USART_ISR_CTS /*!< UART clear to send flag */ #define UART_FLAG_CTSIF USART_ISR_CTSIF /*!< UART clear to send interrupt flag */ #define UART_FLAG_LBDF USART_ISR_LBDF /*!< UART LIN break detection flag */ @@ -674,6 +703,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define UART_IT_LBD 0x0846U /*!< UART LIN break detection interruption */ #define UART_IT_CTS 0x096AU /*!< UART CTS interruption */ #define UART_IT_CM 0x112EU /*!< UART character match interruption */ +#if defined(USART_CR1_UESM) +#define UART_IT_WUF 0x1476U /*!< UART wake-up from stop mode interruption */ +#endif /* USART_CR1_UESM */ +#define UART_IT_RTO 0x0B3AU /*!< UART receiver timeout interruption */ #define UART_IT_ERR 0x0060U /*!< UART error interruption */ @@ -689,13 +722,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define UART_CLEAR_PEF USART_ICR_PECF /*!< Parity Error Clear Flag */ #define UART_CLEAR_FEF USART_ICR_FECF /*!< Framing Error Clear Flag */ -#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ +#define UART_CLEAR_NEF USART_ICR_NCF /*!< Noise Error detected Clear Flag */ #define UART_CLEAR_OREF USART_ICR_ORECF /*!< Overrun Error Clear Flag */ #define UART_CLEAR_IDLEF USART_ICR_IDLECF /*!< IDLE line detected Clear Flag */ #define UART_CLEAR_TCF USART_ICR_TCCF /*!< Transmission Complete Clear Flag */ #define UART_CLEAR_LBDF USART_ICR_LBDCF /*!< LIN Break Detection Clear Flag */ #define UART_CLEAR_CTSF USART_ICR_CTSCF /*!< CTS Interrupt Clear Flag */ #define UART_CLEAR_CMF USART_ICR_CMCF /*!< Character Match Clear Flag */ +#if defined(USART_CR1_UESM) +#define UART_CLEAR_WUF USART_ICR_WUCF /*!< Wake Up from stop mode Clear Flag */ +#endif /* USART_CR1_UESM */ +#define UART_CLEAR_RTOF USART_ICR_RTOCF /*!< UART receiver timeout clear flag */ /** * @} */ @@ -734,9 +771,9 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define __HAL_UART_FLUSH_DRREGISTER(__HANDLE__) \ do{ \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ - SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ - } while(0U) + SET_BIT((__HANDLE__)->Instance->RQR, UART_RXDATA_FLUSH_REQUEST); \ + SET_BIT((__HANDLE__)->Instance->RQR, UART_TXDATA_FLUSH_REQUEST); \ + } while(0U) /** @brief Clear the specified UART pending flag. * @param __HANDLE__ specifies the UART Handle. @@ -748,9 +785,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver Timeout clear flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag +#if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->Instance->ICR = (__FLAG__)) @@ -790,7 +831,13 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __FLAG__ specifies the flag to check. * This parameter can be one of the following values: +#if defined(USART_ISR_REACK) + * @arg @ref UART_FLAG_REACK Receive enable acknowledge flag +#endif * @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_FLAG_WUF Wake up from stop mode flag + #endif * @arg @ref UART_FLAG_RWU Receiver wake up flag (if the UART in mute mode) * @arg @ref UART_FLAG_SBKF Send Break flag * @arg @ref UART_FLAG_CMF Character match flag @@ -802,6 +849,7 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_FLAG_TXE Transmit data register empty flag * @arg @ref UART_FLAG_TC Transmission Complete flag * @arg @ref UART_FLAG_RXNE Receive data register not empty flag + * @arg @ref UART_FLAG_RTOF Receiver Timeout flag * @arg @ref UART_FLAG_IDLE Idle Line detection flag * @arg @ref UART_FLAG_ORE Overrun Error flag * @arg @ref UART_FLAG_NE Noise Error flag @@ -815,12 +863,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to enable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (frame error, noise error, overrun error) @@ -835,12 +887,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to disable. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) @@ -854,37 +910,46 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ -#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) +#define __HAL_UART_GET_IT(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->ISR\ + & (1U << ((__INTERRUPT__)>> 8U))) != RESET) ? SET : RESET) /** @brief Check whether the specified UART interrupt source is enabled or not. * @param __HANDLE__ specifies the UART Handle. * @param __INTERRUPT__ specifies the UART interrupt source to check. * This parameter can be one of the following values: +#if defined(USART_CR1_UESM) + * @arg @ref UART_IT_WUF Wakeup from stop mode interrupt +#endif * @arg @ref UART_IT_CM Character match interrupt * @arg @ref UART_IT_CTS CTS change interrupt * @arg @ref UART_IT_LBD LIN Break detection interrupt * @arg @ref UART_IT_TXE Transmit Data Register empty interrupt * @arg @ref UART_IT_TC Transmission complete interrupt * @arg @ref UART_IT_RXNE Receive Data register not empty interrupt + * @arg @ref UART_IT_RTO Receive Timeout interrupt * @arg @ref UART_IT_IDLE Idle line detection interrupt * @arg @ref UART_IT_PE Parity Error interrupt * @arg @ref UART_IT_ERR Error interrupt (Frame error, noise error, overrun error) * @retval The new state of __INTERRUPT__ (SET or RESET). */ #define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U) ? (__HANDLE__)->Instance->CR1 : \ - (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ - (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) + (((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U) ? (__HANDLE__)->Instance->CR2 : \ + (__HANDLE__)->Instance->CR3)) & (1U << (((uint16_t)(__INTERRUPT__)) & UART_IT_MASK))) != RESET) ? SET : RESET) /** @brief Clear the specified UART ISR flag, in setting the proper ICR register flag. * @param __HANDLE__ specifies the UART Handle. @@ -896,10 +961,14 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @arg @ref UART_CLEAR_NEF Noise detected Clear Flag * @arg @ref UART_CLEAR_OREF Overrun Error Clear Flag * @arg @ref UART_CLEAR_IDLEF IDLE line detected Clear Flag + * @arg @ref UART_CLEAR_RTOF Receiver timeout clear flag * @arg @ref UART_CLEAR_TCF Transmission Complete Clear Flag * @arg @ref UART_CLEAR_LBDF LIN Break Detection Clear Flag * @arg @ref UART_CLEAR_CTSF CTS Interrupt Clear Flag * @arg @ref UART_CLEAR_CMF Character Match Clear Flag + #if defined(USART_CR1_UESM) + * @arg @ref UART_CLEAR_WUF Wake Up from stop mode Clear Flag +#endif * @retval None */ #define __HAL_UART_CLEAR_IT(__HANDLE__, __IT_CLEAR__) ((__HANDLE__)->Instance->ICR = (uint32_t)(__IT_CLEAR__)) @@ -1083,10 +1152,10 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @retval SET (__CONTROL__ is valid) or RESET (__CONTROL__ is invalid) */ #define IS_UART_HARDWARE_FLOW_CONTROL(__CONTROL__)\ - (((__CONTROL__) == UART_HWCONTROL_NONE) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS) || \ - ((__CONTROL__) == UART_HWCONTROL_CTS) || \ - ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) + (((__CONTROL__) == UART_HWCONTROL_NONE) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS) || \ + ((__CONTROL__) == UART_HWCONTROL_CTS) || \ + ((__CONTROL__) == UART_HWCONTROL_RTS_CTS)) /** * @brief Ensure that UART communication mode is valid. @@ -1134,8 +1203,15 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer * @param __TIMEOUT__ UART receiver timeout setting. * @retval SET (__TIMEOUT__ is valid) or RESET (__TIMEOUT__ is invalid) */ -#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ - ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) +#define IS_UART_RECEIVER_TIMEOUT(__TIMEOUT__) (((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_DISABLE) || \ + ((__TIMEOUT__) == UART_RECEIVER_TIMEOUT_ENABLE)) + +/** @brief Check the receiver timeout value. + * @note The maximum UART receiver timeout value is 0xFFFFFF. + * @param __TIMEOUTVALUE__ receiver timeout value. + * @retval Test result (TRUE or FALSE) + */ +#define IS_UART_RECEIVER_TIMEOUT_VALUE(__TIMEOUTVALUE__) ((__TIMEOUTVALUE__) <= 0xFFFFFFU) /** * @brief Ensure that UART LIN state is valid. @@ -1275,6 +1351,16 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer #define IS_UART_ADVFEATURE_MSBFIRST(__MSBFIRST__) (((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_DISABLE) || \ ((__MSBFIRST__) == UART_ADVFEATURE_MSBFIRST_ENABLE)) +#if defined(USART_CR1_UESM) +/** + * @brief Ensure that UART stop mode state is valid. + * @param __STOPMODE__ UART stop mode state. + * @retval SET (__STOPMODE__ is valid) or RESET (__STOPMODE__ is invalid) + */ +#define IS_UART_ADVFEATURE_STOPMODE(__STOPMODE__) (((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_DISABLE) || \ + ((__STOPMODE__) == UART_ADVFEATURE_STOPMODE_ENABLE)) + +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART mute mode state is valid. * @param __MUTE__ UART mute mode state. @@ -1282,6 +1368,17 @@ typedef void (*pUART_CallbackTypeDef)(UART_HandleTypeDef *huart); /*!< pointer */ #define IS_UART_MUTE_MODE(__MUTE__) (((__MUTE__) == UART_ADVFEATURE_MUTEMODE_DISABLE) || \ ((__MUTE__) == UART_ADVFEATURE_MUTEMODE_ENABLE)) +#if defined(USART_CR1_UESM) + +/** + * @brief Ensure that UART wake-up selection is valid. + * @param __WAKE__ UART wake-up selection. + * @retval SET (__WAKE__ is valid) or RESET (__WAKE__ is invalid) + */ +#define IS_UART_WAKEUP_SELECTION(__WAKE__) (((__WAKE__) == UART_WAKEUP_ON_ADDRESS) || \ + ((__WAKE__) == UART_WAKEUP_ON_STARTBIT) || \ + ((__WAKE__) == UART_WAKEUP_ON_READDATA_NONEMPTY)) +#endif /* USART_CR1_UESM */ /** * @brief Ensure that UART driver enable polarity is valid. @@ -1320,7 +1417,8 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef *huart); /* Callbacks Register/UnRegister functions ***********************************/ #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback); +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback); HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -1369,6 +1467,10 @@ void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart); */ /* Peripheral Control functions ************************************************/ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue); +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart); + HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart); HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart); @@ -1405,7 +1507,8 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart); #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart); HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart); -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout); +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout); void UART_AdvFeatureConfig(UART_HandleTypeDef *huart); /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h index a5907f57..866a490f 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Inc/stm32f7xx_hal_uart_ex.h @@ -41,7 +41,24 @@ extern "C" { * @{ */ +#if defined(USART_CR1_UESM) +/** + * @brief UART wake up from stop mode parameters + */ +typedef struct +{ + uint32_t WakeUpEvent; /*!< Specifies which event will activate the Wakeup from Stop mode flag (WUF). + This parameter can be a value of @ref UART_WakeUp_from_Stop_Selection. + If set to UART_WAKEUP_ON_ADDRESS, the two other fields below must + be filled up. */ + uint16_t AddressLength; /*!< Specifies whether the address is 4 or 7-bit long. + This parameter can be a value of @ref UARTEx_WakeUp_Address_Length. */ + + uint8_t Address; /*!< UART/USART node address (7-bit long max). */ +} UART_WakeUpTypeDef; + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -54,9 +71,9 @@ extern "C" { /** @defgroup UARTEx_Word_Length UARTEx Word Length * @{ */ -#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ -#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ -#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ +#define UART_WORDLENGTH_7B USART_CR1_M1 /*!< 7-bit long UART frame */ +#define UART_WORDLENGTH_8B 0x00000000U /*!< 8-bit long UART frame */ +#define UART_WORDLENGTH_9B USART_CR1_M0 /*!< 9-bit long UART frame */ /** * @} */ @@ -64,13 +81,12 @@ extern "C" { /** @defgroup UARTEx_WakeUp_Address_Length UARTEx WakeUp Address Length * @{ */ -#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ -#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ +#define UART_ADDRESS_DETECT_4B 0x00000000U /*!< 4-bit long wake-up address */ +#define UART_ADDRESS_DETECT_7B USART_CR2_ADDM7 /*!< 7-bit long wake-up address */ /** * @} */ - /** * @} */ @@ -86,7 +102,8 @@ extern "C" { */ /* Initialization and de-initialization functions ****************************/ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime); +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime); /** * @} @@ -96,6 +113,10 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @{ */ +#if defined(USART_CR1_UESM) +void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart); + +#endif /* USART_CR1_UESM */ /** * @} @@ -106,8 +127,20 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, */ /* Peripheral Control functions **********************************************/ +#if defined(USART_CR1_UESM) +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart); + +#endif/* USART_CR1_UESM */ +#if defined(USART_CR3_UCESM) +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart); +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart); + +#endif /* USART_CR3_UCESM */ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *huart, uint32_t AddressLength); + /** * @} */ @@ -126,12 +159,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua * @param __CLOCKSOURCE__ output variable. * @retval UART clocking source, written in __CLOCKSOURCE__. */ -#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ +#define UART_GETCLOCKSOURCE(__HANDLE__,__CLOCKSOURCE__) \ do { \ if((__HANDLE__)->Instance == USART1) \ { \ - switch(__HAL_RCC_GET_USART1_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART1_SOURCE()) \ + { \ case RCC_USART1CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -147,12 +180,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART2) \ { \ - switch(__HAL_RCC_GET_USART2_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART2_SOURCE()) \ + { \ case RCC_USART2CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -168,12 +201,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART3) \ { \ - switch(__HAL_RCC_GET_USART3_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART3_SOURCE()) \ + { \ case RCC_USART3CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -189,12 +222,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == UART4) \ { \ - switch(__HAL_RCC_GET_UART4_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART4_SOURCE()) \ + { \ case RCC_UART4CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -210,12 +243,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART5) \ { \ - switch(__HAL_RCC_GET_UART5_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART5_SOURCE()) \ + { \ case RCC_UART5CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -231,12 +264,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if((__HANDLE__)->Instance == USART6) \ { \ - switch(__HAL_RCC_GET_USART6_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_USART6_SOURCE()) \ + { \ case RCC_USART6CLKSOURCE_PCLK2: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK2; \ break; \ @@ -252,12 +285,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART7) \ { \ - switch(__HAL_RCC_GET_UART7_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART7_SOURCE()) \ + { \ case RCC_UART7CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -273,12 +306,12 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else if ((__HANDLE__)->Instance == UART8) \ { \ - switch(__HAL_RCC_GET_UART8_SOURCE()) \ - { \ + switch(__HAL_RCC_GET_UART8_SOURCE()) \ + { \ case RCC_UART8CLKSOURCE_PCLK1: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_PCLK1; \ break; \ @@ -294,7 +327,7 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua default: \ (__CLOCKSOURCE__) = UART_CLOCKSOURCE_UNDEFINED; \ break; \ - } \ + } \ } \ else \ { \ @@ -313,44 +346,44 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua */ #define UART_MASK_COMPUTATION(__HANDLE__) \ do { \ - if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_9B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x01FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_8B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x00FFU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - } \ - else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ - { \ - if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ - { \ + } \ + } \ + else if ((__HANDLE__)->Init.WordLength == UART_WORDLENGTH_7B) \ + { \ + if ((__HANDLE__)->Init.Parity == UART_PARITY_NONE) \ + { \ (__HANDLE__)->Mask = 0x007FU ; \ - } \ - else \ - { \ + } \ + else \ + { \ (__HANDLE__)->Mask = 0x003FU ; \ - } \ - } \ - else \ - { \ - (__HANDLE__)->Mask = 0x0000U; \ - } \ -} while(0U) + } \ + } \ + else \ + { \ + (__HANDLE__)->Mask = 0x0000U; \ + } \ + } while(0U) /** * @brief Ensure that UART frame length is valid. @@ -369,7 +402,6 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua #define IS_UART_ADDRESSLENGTH_DETECT(__ADDRESS__) (((__ADDRESS__) == UART_ADDRESS_DETECT_4B) || \ ((__ADDRESS__) == UART_ADDRESS_DETECT_7B)) - /** * @} */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c index 81a39d76..48bbd535 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal.c @@ -50,11 +50,11 @@ * @{ */ /** - * @brief STM32F7xx HAL Driver version number V1.2.7 + * @brief STM32F7xx HAL Driver version number V1.2.8 */ #define __STM32F7xx_HAL_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __STM32F7xx_HAL_VERSION_SUB1 (0x02) /*!< [23:16] sub1 version */ -#define __STM32F7xx_HAL_VERSION_SUB2 (0x07) /*!< [15:8] sub2 version */ +#define __STM32F7xx_HAL_VERSION_SUB2 (0x08) /*!< [15:8] sub2 version */ #define __STM32F7xx_HAL_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __STM32F7xx_HAL_VERSION ((__STM32F7xx_HAL_VERSION_MAIN << 24)\ |(__STM32F7xx_HAL_VERSION_SUB1 << 16)\ @@ -319,14 +319,26 @@ uint32_t HAL_GetTickPrio(void) HAL_StatusTypeDef HAL_SetTickFreq(HAL_TickFreqTypeDef Freq) { HAL_StatusTypeDef status = HAL_OK; + HAL_TickFreqTypeDef prevTickFreq; + assert_param(IS_TICKFREQ(Freq)); if (uwTickFreq != Freq) { + /* Back up uwTickFreq frequency */ + prevTickFreq = uwTickFreq; + + /* Update uwTickFreq global variable used by HAL_InitTick() */ uwTickFreq = Freq; /* Apply the new tick Freq */ status = HAL_InitTick(uwTickPrio); + + if (status != HAL_OK) + { + /* Restore previous tick frequency */ + uwTickFreq = prevTickFreq; + } } return status; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c index 6978c4da..a381dfc4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_can.c @@ -1556,7 +1556,7 @@ HAL_StatusTypeDef HAL_CAN_GetRxMessage(CAN_HandleTypeDef *hcan, uint32_t RxFifo, { pHeader->ExtId = ((CAN_RI0R_EXID | CAN_RI0R_STID) & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_EXID_Pos; } - pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR) >> CAN_RI0R_RTR_Pos; + pHeader->RTR = (CAN_RI0R_RTR & hcan->Instance->sFIFOMailBox[RxFifo].RIR); pHeader->DLC = (CAN_RDT0R_DLC & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_DLC_Pos; pHeader->FilterMatchIndex = (CAN_RDT0R_FMI & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_FMI_Pos; pHeader->Timestamp = (CAN_RDT0R_TIME & hcan->Instance->sFIFOMailBox[RxFifo].RDTR) >> CAN_RDT0R_TIME_Pos; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c index 07e53536..246f4562 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_exti.c @@ -85,7 +85,6 @@ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" -#include "stm32f7xx_hal_exti.h" /** @addtogroup STM32F7xx_HAL_Driver * @{ @@ -105,7 +104,7 @@ #ifdef HAL_EXTI_MODULE_ENABLED /* Private typedef -----------------------------------------------------------*/ -/* Private defines ------------------------------------------------------------*/ +/* Private defines -----------------------------------------------------------*/ /** @defgroup EXTI_Private_Constants EXTI Private Constants * @{ */ @@ -144,6 +143,8 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) @@ -154,37 +155,77 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Check parameters */ assert_param(IS_EXTI_LINE(pExtiConfig->Line)); assert_param(IS_EXTI_MODE(pExtiConfig->Mode)); - assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); - + /* Assign line number to handle */ hexti->Line = pExtiConfig->Line; - - /* Clear EXTI line configuration */ - EXTI->IMR &= ~pExtiConfig->Line; - EXTI->EMR &= ~pExtiConfig->Line; - - /* Select the Mode for the selected external interrupts */ - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Mode; - *(__IO uint32_t *) regval |= pExtiConfig->Line; - - /* Clear Rising Falling edge configuration */ - EXTI->RTSR &= ~pExtiConfig->Line; - EXTI->FTSR &= ~pExtiConfig->Line; - - /* Select the trigger for the selected external interrupts */ - if (pExtiConfig->Trigger == EXTI_TRIGGER_RISING_FALLING) + + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* Configure triggers for configurable lines */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) { - /* Rising Falling edge */ - EXTI->RTSR |= pExtiConfig->Line; - EXTI->FTSR |= pExtiConfig->Line; + assert_param(IS_EXTI_TRIGGER(pExtiConfig->Trigger)); + + /* Configure rising trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_RISING) != 0x00u) + { + EXTI->RTSR |= maskline; + } + else + { + EXTI->RTSR &= ~maskline; + } + + /* Configure falling trigger */ + /* Mask or set line */ + if ((pExtiConfig->Trigger & EXTI_TRIGGER_FALLING) != 0x00u) + { + EXTI->FTSR |= maskline; + } + else + { + EXTI->FTSR &= ~maskline; + } + + + /* Configure gpio port selection in case of gpio exti line */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PORT(pExtiConfig->GPIOSel)); + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + regval |= (pExtiConfig->GPIOSel << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } + + /* Configure interrupt mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_INTERRUPT) != 0x00u) + { + EXTI->IMR |= maskline; } else { - regval = (uint32_t)EXTI_BASE; - regval += pExtiConfig->Trigger; - *(__IO uint32_t *) regval |= pExtiConfig->Line; + EXTI->IMR &= ~maskline; } + + /* Configure event mode : read current mode */ + /* Mask or set line */ + if ((pExtiConfig->Mode & EXTI_MODE_EVENT) != 0x00u) + { + EXTI->EMR |= maskline; + } + else + { + EXTI->EMR &= ~maskline; + } + return HAL_OK; } @@ -196,6 +237,10 @@ HAL_StatusTypeDef HAL_EXTI_SetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigTypeDef *pExtiConfig) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if ((hexti == NULL) || (pExtiConfig == NULL)) { @@ -208,41 +253,67 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT /* Store handle line number to configuration structure */ pExtiConfig->Line = hexti->Line; - /* Get EXTI mode to configiguration structure */ - if ((EXTI->IMR & hexti->Line) == hexti->Line) + /* Compute line mask */ + linepos = (pExtiConfig->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + + /* 1] Get core mode : interrupt */ + + /* Check if selected line is enable */ + if ((EXTI->IMR & maskline) != 0x00u) { pExtiConfig->Mode = EXTI_MODE_INTERRUPT; } - else if ((EXTI->EMR & hexti->Line) == hexti->Line) - { - pExtiConfig->Mode = EXTI_MODE_EVENT; - } else { - /* No MODE selected */ - pExtiConfig->Mode = 0x0Bu; + pExtiConfig->Mode = EXTI_MODE_NONE; } - /* Get EXTI Trigger to configiguration structure */ - if ((EXTI->RTSR & hexti->Line) == hexti->Line) + /* Get event mode */ + /* Check if selected line is enable */ + if ((EXTI->EMR & maskline) != 0x00u) { - if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_RISING_FALLING; - } - else + pExtiConfig->Mode |= EXTI_MODE_EVENT; + } + + /* 2] Get trigger for configurable lines : rising */ + if ((pExtiConfig->Line & EXTI_CONFIG) != 0x00u) + { + /* Check if configuration of selected line is enable */ + if ((EXTI->RTSR & maskline) != 0x00u) { pExtiConfig->Trigger = EXTI_TRIGGER_RISING; } - } - else if ((EXTI->FTSR & hexti->Line) == hexti->Line) - { - pExtiConfig->Trigger = EXTI_TRIGGER_FALLING; + else + { + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + } + + /* Get falling configuration */ + /* Check if configuration of selected line is enable */ + if ((EXTI->FTSR & maskline) != 0x00u) + { + pExtiConfig->Trigger |= EXTI_TRIGGER_FALLING; + } + + /* Get Gpio port selection for gpio lines */ + if ((pExtiConfig->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + pExtiConfig->GPIOSel = ((regval << (SYSCFG_EXTICR1_EXTI1_Pos * (3uL - (linepos & 0x03u)))) >> 24); + } + else + { + pExtiConfig->GPIOSel = 0x00u; + } } else { /* No Trigger selected */ - pExtiConfig->Trigger = 0x00u; + pExtiConfig->Trigger = EXTI_TRIGGER_NONE; + pExtiConfig->GPIOSel = 0x00u; } return HAL_OK; @@ -255,6 +326,10 @@ HAL_StatusTypeDef HAL_EXTI_GetConfigLine(EXTI_HandleTypeDef *hexti, EXTI_ConfigT */ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) { + uint32_t regval; + uint32_t linepos; + uint32_t maskline; + /* Check null pointer */ if (hexti == NULL) { @@ -264,15 +339,32 @@ HAL_StatusTypeDef HAL_EXTI_ClearConfigLine(EXTI_HandleTypeDef *hexti) /* Check the parameter */ assert_param(IS_EXTI_LINE(hexti->Line)); + /* compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); + /* 1] Clear interrupt mode */ - EXTI->IMR = (EXTI->IMR & ~hexti->Line); + EXTI->IMR = (EXTI->IMR & ~maskline); /* 2] Clear event mode */ - EXTI->EMR = (EXTI->EMR & ~hexti->Line); + EXTI->EMR = (EXTI->EMR & ~maskline); - /* 3] Clear triggers */ - EXTI->RTSR = (EXTI->RTSR & ~hexti->Line); - EXTI->FTSR = (EXTI->FTSR & ~hexti->Line); + /* 3] Clear triggers in case of configurable lines */ + if ((hexti->Line & EXTI_CONFIG) != 0x00u) + { + EXTI->RTSR = (EXTI->RTSR & ~maskline); + EXTI->FTSR = (EXTI->FTSR & ~maskline); + + /* Get Gpio port selection for gpio lines */ + if ((hexti->Line & EXTI_GPIO) == EXTI_GPIO) + { + assert_param(IS_EXTI_GPIO_PIN(linepos)); + + regval = SYSCFG->EXTICR[linepos >> 2u]; + regval &= ~(SYSCFG_EXTICR1_EXTI0 << (SYSCFG_EXTICR1_EXTI1_Pos * (linepos & 0x03u))); + SYSCFG->EXTICR[linepos >> 2u] = regval; + } + } return HAL_OK; } @@ -352,17 +444,18 @@ HAL_StatusTypeDef HAL_EXTI_GetHandle(EXTI_HandleTypeDef *hexti, uint32_t ExtiLin */ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t maskline; + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); /* Get pending bit */ - regaddr = (&EXTI->PR); - regval = (*regaddr & hexti->Line); - + regval = (EXTI->PR & maskline); if (regval != 0x00u) { /* Clear pending bit */ - *regaddr = hexti->Line; + EXTI->PR = maskline; /* Call callback */ if (hexti->PendingCallback != NULL) @@ -383,19 +476,21 @@ void HAL_EXTI_IRQHandler(EXTI_HandleTypeDef *hexti) */ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { - __IO uint32_t *regaddr; uint32_t regval; + uint32_t linepos; + uint32_t maskline; /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - /* Get pending bit */ - regaddr = &EXTI->PR; + /* Compute line mask */ + linepos = (hexti->Line & EXTI_PIN_MASK); + maskline = (1uL << linepos); /* return 1 if bit is set else 0 */ - regval = ((*regaddr & hexti->Line) >> POSITION_VAL(hexti->Line)); - + regval = ((EXTI->PR & maskline) >> linepos); return regval; } @@ -410,12 +505,18 @@ uint32_t HAL_EXTI_GetPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); assert_param(IS_EXTI_PENDING_EDGE(Edge)); - + + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + /* Clear Pending bit */ - EXTI->PR = hexti->Line; + EXTI->PR = maskline; } /** @@ -425,10 +526,17 @@ void HAL_EXTI_ClearPending(EXTI_HandleTypeDef *hexti, uint32_t Edge) */ void HAL_EXTI_GenerateSWI(EXTI_HandleTypeDef *hexti) { + uint32_t maskline; + /* Check parameters */ assert_param(IS_EXTI_LINE(hexti->Line)); + assert_param(IS_EXTI_CONFIG_LINE(hexti->Line)); - EXTI->SWIER = hexti->Line; + /* Compute line mask */ + maskline = (1uL << (hexti->Line & EXTI_PIN_MASK)); + + /* Generate Software interrupt */ + EXTI->SWIER = maskline; } /** diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c index ffc617dd..0afa1df1 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_gpio.c @@ -190,25 +190,6 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) if(iocurrent == ioposition) { /*--------------------- GPIO Mode Configuration ------------------------*/ - /* In case of Alternate function mode selection */ - if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) - { - /* Check the Alternate function parameter */ - assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); - - /* Configure Alternate function mapped with the current IO */ - temp = GPIOx->AFR[position >> 3]; - temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); - GPIOx->AFR[position >> 3] = temp; - } - - /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ - temp = GPIOx->MODER; - temp &= ~(GPIO_MODER_MODER0 << (position * 2)); - temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); - GPIOx->MODER = temp; - /* In case of Output or Alternate function mode selection */ if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) @@ -234,6 +215,25 @@ void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) temp |= ((GPIO_Init->Pull) << (position * 2)); GPIOx->PUPDR = temp; + /* In case of Alternate function mode selection */ + if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) + { + /* Check the Alternate function parameter */ + assert_param(IS_GPIO_AF(GPIO_Init->Alternate)); + + /* Configure Alternate function mapped with the current IO */ + temp = GPIOx->AFR[position >> 3]; + temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; + temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4)); + GPIOx->AFR[position >> 3] = temp; + } + + /* Configure IO Direction mode (Input, Output, Alternate or Analog) */ + temp = GPIOx->MODER; + temp &= ~(GPIO_MODER_MODER0 << (position * 2)); + temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2)); + GPIOx->MODER = temp; + /*--------------------- EXTI Mode Configuration ------------------------*/ /* Configure the External Interrupt or event for the current IO */ if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE) @@ -300,7 +300,7 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_ALL_INSTANCE(GPIOx)); - + /* Configure the port pins */ for(position = 0; position < GPIO_NUMBER; position++) { @@ -316,10 +316,6 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) tmp &= (((uint32_t)0x0F) << (4 * (position & 0x03))); if(tmp == ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)))) { - /* Configure the External Interrupt or event for the current IO */ - tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); - SYSCFG->EXTICR[position >> 2] &= ~tmp; - /* Clear EXTI line configuration */ EXTI->IMR &= ~((uint32_t)iocurrent); EXTI->EMR &= ~((uint32_t)iocurrent); @@ -327,6 +323,10 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Clear Rising Falling edge configuration */ EXTI->RTSR &= ~((uint32_t)iocurrent); EXTI->FTSR &= ~((uint32_t)iocurrent); + + /* Configure the External Interrupt or event for the current IO */ + tmp = ((uint32_t)0x0F) << (4 * (position & 0x03)); + SYSCFG->EXTICR[position >> 2] &= ~tmp; } /*------------------------- GPIO Mode Configuration --------------------*/ /* Configure IO Direction in Input Floating Mode */ @@ -335,14 +335,14 @@ void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin) /* Configure the default Alternate Function in current IO */ GPIOx->AFR[position >> 3] &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ; - /* Configure the default value for IO Speed */ - GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); + /* Deactivate the Pull-up and Pull-down resistor for the current IO */ + GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); /* Configure the default value IO Output Type */ GPIOx->OTYPER &= ~(GPIO_OTYPER_OT_0 << position) ; - /* Deactivate the Pull-up and Pull-down resistor for the current IO */ - GPIOx->PUPDR &= ~(GPIO_PUPDR_PUPDR0 << (position * 2)); + /* Configure the default value for IO Speed */ + GPIOx->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2)); } } } @@ -431,13 +431,13 @@ void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) /* Check the parameters */ assert_param(IS_GPIO_PIN(GPIO_Pin)); - if ((GPIOx->ODR & GPIO_Pin) == GPIO_Pin) + if ((GPIOx->ODR & GPIO_Pin) != 0X00u) { GPIOx->BSRR = (uint32_t)GPIO_Pin << GPIO_NUMBER; } else { - GPIOx->BSRR = GPIO_Pin; + GPIOx->BSRR = (uint32_t)GPIO_Pin; } } @@ -467,10 +467,11 @@ HAL_StatusTypeDef HAL_GPIO_LockPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) GPIOx->LCKR = GPIO_Pin; /* Set LCKx bit(s): LCKK='1' + LCK[15-0] */ GPIOx->LCKR = tmp; - /* Read LCKK bit*/ + /* Read LCKR register. This read is mandatory to complete key lock sequence */ tmp = GPIOx->LCKR; - if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) + /* Read again in order to confirm lock is active */ + if((GPIOx->LCKR & GPIO_LCKR_LCKK) != RESET) { return HAL_OK; } diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c index 775bff23..ef049ec4 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_i2c.c @@ -223,12 +223,12 @@ *** Callback registration *** ============================================= - + [..] The compilation flag USE_HAL_I2C_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. Use Functions @ref HAL_I2C_RegisterCallback() or @ref HAL_I2C_RegisterAddrCallback() to register an interrupt callback. - + [..] Function @ref HAL_I2C_RegisterCallback() allows to register following callbacks: (+) MasterTxCpltCallback : callback for Master transmission end of transfer. (+) MasterRxCpltCallback : callback for Master reception end of transfer. @@ -243,9 +243,9 @@ (+) MspDeInitCallback : callback for Msp DeInit. This function takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. - + [..] For specific callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_RegisterAddrCallback(). - + [..] Use function @ref HAL_I2C_UnRegisterCallback to reset a callback to the default weak function. @ref HAL_I2C_UnRegisterCallback takes as parameters the HAL peripheral handle, @@ -262,9 +262,9 @@ (+) AbortCpltCallback : callback for abort completion process. (+) MspInitCallback : callback for Msp Init. (+) MspDeInitCallback : callback for Msp DeInit. - + [..] For callback AddrCallback use dedicated register callbacks : @ref HAL_I2C_UnRegisterAddrCallback(). - + [..] By default, after the @ref HAL_I2C_Init() and when the state is @ref HAL_I2C_STATE_RESET all callbacks are set to the corresponding weak functions: examples @ref HAL_I2C_MasterTxCpltCallback(), @ref HAL_I2C_MasterRxCpltCallback(). @@ -273,7 +273,7 @@ these callbacks are null (not registered beforehand). If MspInit or MspDeInit are not null, the @ref HAL_I2C_Init()/ @ref HAL_I2C_DeInit() keep and use the user MspInit/MspDeInit callbacks (registered beforehand) whatever the state. - + [..] Callbacks can be registered/unregistered in @ref HAL_I2C_STATE_READY state only. Exception done MspInit/MspDeInit functions that can be registered/unregistered in @ref HAL_I2C_STATE_READY or @ref HAL_I2C_STATE_RESET state, @@ -281,7 +281,7 @@ Then, the user first registers the MspInit/MspDeInit user callbacks using @ref HAL_I2C_RegisterCallback() before calling @ref HAL_I2C_DeInit() or @ref HAL_I2C_Init() function. - + [..] When the compilation flag USE_HAL_I2C_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -4737,6 +4737,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, tmpITFlags); + } + if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -4788,9 +4795,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint { if (hi2c->XferCount > 0U) { - /* Remove RXNE flag on temporary variable as read done */ - tmpITFlags &= ~I2C_FLAG_RXNE; - /* Read data from RXDR */ *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->RXDR; @@ -4844,13 +4848,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_IT(struct __I2C_HandleTypeDef *hi2c, uint /* Nothing to do */ } - /* Check if STOPF is set */ - if ((I2C_CHECK_FLAG(tmpITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, tmpITFlags); - } - /* Process Unlocked */ __HAL_UNLOCK(hi2c); @@ -5008,6 +5005,13 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin /* Process locked */ __HAL_LOCK(hi2c); + /* Check if STOPF is set */ + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) + { + /* Call I2C Slave complete process */ + I2C_ITSlaveCplt(hi2c, ITFlags); + } + if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_AF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_NACKI) != RESET)) { /* Check that I2C transfer finished */ @@ -5092,11 +5096,6 @@ static HAL_StatusTypeDef I2C_Slave_ISR_DMA(struct __I2C_HandleTypeDef *hi2c, uin { I2C_ITAddrCplt(hi2c, ITFlags); } - else if ((I2C_CHECK_FLAG(ITFlags, I2C_FLAG_STOPF) != RESET) && (I2C_CHECK_IT_SOURCE(ITSources, I2C_IT_STOPI) != RESET)) - { - /* Call I2C Slave complete process */ - I2C_ITSlaveCplt(hi2c, ITFlags); - } else { /* Nothing to do */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c index bf33cff4..d63a6f4e 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_rcc.c @@ -317,7 +317,7 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) SystemCoreClock = HSI_VALUE; /* Adapt Systick interrupt period */ - if(HAL_InitTick(TICK_INT_PRIORITY) != HAL_OK) + if (HAL_InitTick(uwTickPrio) != HAL_OK) { return HAL_ERROR; } @@ -344,10 +344,11 @@ HAL_StatusTypeDef HAL_RCC_DeInit(void) HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) { uint32_t tickstart; + uint32_t pll_config; FlagStatus pwrclkchanged = RESET; /* Check Null pointer */ - if(RCC_OscInitStruct == NULL) + if (RCC_OscInitStruct == NULL) { return HAL_ERROR; } @@ -356,15 +357,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) assert_param(IS_RCC_OSCILLATORTYPE(RCC_OscInitStruct->OscillatorType)); /*------------------------------- HSE Configuration ------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSE) == RCC_OSCILLATORTYPE_HSE) { /* Check the parameters */ assert_param(IS_RCC_HSE(RCC_OscInitStruct->HSEState)); /* When the HSE is used as system clock or clock source for PLL, It can not be disabled */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSE) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSE))) { - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) && (RCC_OscInitStruct->HSEState == RCC_HSE_OFF)) { return HAL_ERROR; } @@ -375,15 +376,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) __HAL_RCC_HSE_CONFIG(RCC_OscInitStruct->HSEState); /* Check the HSE State */ - if(RCC_OscInitStruct->HSEState != RCC_HSE_OFF) + if (RCC_OscInitStruct->HSEState != RCC_HSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till HSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -395,9 +396,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSE is bypassed or disabled */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -406,18 +407,18 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*----------------------------- HSI Configuration --------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_HSI) == RCC_OSCILLATORTYPE_HSI) { /* Check the parameters */ assert_param(IS_RCC_HSI(RCC_OscInitStruct->HSIState)); assert_param(IS_RCC_CALIBRATION_VALUE(RCC_OscInitStruct->HSICalibrationValue)); /* Check if HSI is used as system clock or as PLL source when PLL is selected as system clock */ - if((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) - || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) + if ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_HSI) + || ((__HAL_RCC_GET_SYSCLK_SOURCE() == RCC_SYSCLKSOURCE_STATUS_PLLCLK) && ((RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) == RCC_PLLCFGR_PLLSRC_HSI))) { /* When HSI is used as system clock it will not disabled */ - if((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) + if ((__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) && (RCC_OscInitStruct->HSIState != RCC_HSI_ON)) { return HAL_ERROR; } @@ -431,7 +432,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) else { /* Check the HSI State */ - if((RCC_OscInitStruct->HSIState)!= RCC_HSI_OFF) + if ((RCC_OscInitStruct->HSIState) != RCC_HSI_OFF) { /* Enable the Internal High Speed oscillator (HSI). */ __HAL_RCC_HSI_ENABLE(); @@ -440,9 +441,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -460,9 +461,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till HSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > HSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > HSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -471,13 +472,13 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSI Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSI) == RCC_OSCILLATORTYPE_LSI) { /* Check the parameters */ assert_param(IS_RCC_LSI(RCC_OscInitStruct->LSIState)); /* Check the LSI State */ - if((RCC_OscInitStruct->LSIState)!= RCC_LSI_OFF) + if ((RCC_OscInitStruct->LSIState) != RCC_LSI_OFF) { /* Enable the Internal Low Speed oscillator (LSI). */ __HAL_RCC_LSI_ENABLE(); @@ -486,9 +487,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -503,9 +504,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSI is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSIRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > LSI_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > LSI_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -513,21 +514,21 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } } /*------------------------------ LSE Configuration -------------------------*/ - if(((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) + if (((RCC_OscInitStruct->OscillatorType) & RCC_OSCILLATORTYPE_LSE) == RCC_OSCILLATORTYPE_LSE) { /* Check the parameters */ assert_param(IS_RCC_LSE(RCC_OscInitStruct->LSEState)); /* Update LSE configuration in Backup Domain control register */ /* Requires to enable write access to Backup Domain of necessary */ - if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + if (__HAL_RCC_PWR_IS_CLK_DISABLED()) { /* Enable Power Clock*/ __HAL_RCC_PWR_CLK_ENABLE(); pwrclkchanged = SET; } - if(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + if (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { /* Enable write access to Backup domain */ PWR->CR1 |= PWR_CR1_DBP; @@ -535,9 +536,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Wait for Backup domain Write protection disable */ tickstart = HAL_GetTick(); - while(HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) + while (HAL_IS_BIT_CLR(PWR->CR1, PWR_CR1_DBP)) { - if((HAL_GetTick() - tickstart ) > RCC_DBP_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_DBP_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -547,15 +548,15 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) /* Set the new LSE configuration -----------------------------------------*/ __HAL_RCC_LSE_CONFIG(RCC_OscInitStruct->LSEState); /* Check the LSE State */ - if((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) + if ((RCC_OscInitStruct->LSEState) != RCC_LSE_OFF) { /* Get Start Tick*/ tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) == RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -567,9 +568,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till LSE is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_LSERDY) != RESET) { - if((HAL_GetTick() - tickstart ) > RCC_LSE_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > RCC_LSE_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -577,7 +578,7 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Restore clock configuration if changed */ - if(pwrclkchanged == SET) + if (pwrclkchanged == SET) { __HAL_RCC_PWR_CLK_DISABLE(); } @@ -588,9 +589,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) if ((RCC_OscInitStruct->PLL.PLLState) != RCC_PLL_NONE) { /* Check if the PLL is used as system clock or not */ - if(__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) + if (__HAL_RCC_GET_SYSCLK_SOURCE() != RCC_SYSCLKSOURCE_STATUS_PLLCLK) { - if((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) + if ((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_ON) { /* Check the parameters */ assert_param(IS_RCC_PLLSOURCE(RCC_OscInitStruct->PLL.PLLSource)); @@ -609,9 +610,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -640,9 +641,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -657,9 +658,9 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) tickstart = HAL_GetTick(); /* Wait till PLL is ready */ - while(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) + while (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) != RESET) { - if((HAL_GetTick() - tickstart ) > PLL_TIMEOUT_VALUE) + if ((HAL_GetTick() - tickstart) > PLL_TIMEOUT_VALUE) { return HAL_TIMEOUT; } @@ -668,7 +669,27 @@ HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } else { - return HAL_ERROR; + /* Do not return HAL_ERROR if request repeats the current configuration */ + pll_config = RCC->PLLCFGR; +#if defined (RCC_PLLCFGR_PLLR) + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLR) != (RCC_OscInitStruct->PLL.PLLR << RCC_PLLCFGR_PLLR_Pos))) +#else + if (((RCC_OscInitStruct->PLL.PLLState) == RCC_PLL_OFF) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLSRC) != RCC_OscInitStruct->PLL.PLLSource) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLM) != RCC_OscInitStruct->PLL.PLLM) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLN) != (RCC_OscInitStruct->PLL.PLLN << RCC_PLLCFGR_PLLN_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLP) != ((((RCC_OscInitStruct->PLL.PLLP) >> 1U) - 1U) << RCC_PLLCFGR_PLLP_Pos)) || + (READ_BIT(pll_config, RCC_PLLCFGR_PLLQ) != (RCC_OscInitStruct->PLL.PLLQ << RCC_PLLCFGR_PLLQ_Pos))) +#endif + { + return HAL_ERROR; + } } } return HAL_OK; @@ -705,7 +726,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui uint32_t tickstart = 0; /* Check Null pointer */ - if(RCC_ClkInitStruct == NULL) + if (RCC_ClkInitStruct == NULL) { return HAL_ERROR; } @@ -719,30 +740,30 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui (HCLK) and the supply voltage of the device. */ /* Increasing the CPU frequency */ - if(FLatency > __HAL_FLASH_GET_LATENCY()) + if (FLatency > __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- HCLK Configuration --------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_HCLK) == RCC_CLOCKTYPE_HCLK) { /* Set the highest APBx dividers in order to ensure that we do not go through a non-spec phase whatever we decrease or increase HCLK. */ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_HCLK_DIV16); } - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, (RCC_HCLK_DIV16 << 3)); } @@ -753,24 +774,24 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /*------------------------- SYSCLK Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_SYSCLK) == RCC_CLOCKTYPE_SYSCLK) { assert_param(IS_RCC_SYSCLKSOURCE(RCC_ClkInitStruct->SYSCLKSource)); /* HSE is selected as System Clock Source */ - if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) + if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_HSE) { /* Check the HSE ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSERDY) == RESET) { return HAL_ERROR; } } /* PLL is selected as System Clock Source */ - else if(RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) + else if (RCC_ClkInitStruct->SYSCLKSource == RCC_SYSCLKSOURCE_PLLCLK) { /* Check the PLL ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_PLLRDY) == RESET) { return HAL_ERROR; } @@ -779,7 +800,7 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui else { /* Check the HSI ready flag */ - if(__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) + if (__HAL_RCC_GET_FLAG(RCC_FLAG_HSIRDY) == RESET) { return HAL_ERROR; } @@ -800,38 +821,38 @@ HAL_StatusTypeDef HAL_RCC_ClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, ui } /* Decreasing the number of wait states because of lower CPU frequency */ - if(FLatency < __HAL_FLASH_GET_LATENCY()) + if (FLatency < __HAL_FLASH_GET_LATENCY()) { /* Program the new number of wait states to the LATENCY bits in the FLASH_ACR register */ __HAL_FLASH_SET_LATENCY(FLatency); /* Check that the new number of wait states is taken into account to access the Flash memory by reading the FLASH_ACR register */ - if(__HAL_FLASH_GET_LATENCY() != FLatency) + if (__HAL_FLASH_GET_LATENCY() != FLatency) { return HAL_ERROR; } } /*-------------------------- PCLK1 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK1) == RCC_CLOCKTYPE_PCLK1) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB1CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE1, RCC_ClkInitStruct->APB1CLKDivider); } /*-------------------------- PCLK2 Configuration ---------------------------*/ - if(((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) + if (((RCC_ClkInitStruct->ClockType) & RCC_CLOCKTYPE_PCLK2) == RCC_CLOCKTYPE_PCLK2) { assert_param(IS_RCC_PCLK(RCC_ClkInitStruct->APB2CLKDivider)); MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE2, ((RCC_ClkInitStruct->APB2CLKDivider) << 3)); } /* Update the SystemCoreClock global variable */ - SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE)>> RCC_CFGR_HPRE_Pos]; + SystemCoreClock = HAL_RCC_GetSysClockFreq() >> AHBPrescTable[(RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos]; /* Configure the source of time base considering new system clocks settings*/ - HAL_InitTick (TICK_INT_PRIORITY); + HAL_InitTick(uwTickPrio); return HAL_OK; } @@ -888,7 +909,7 @@ void HAL_RCC_MCOConfig(uint32_t RCC_MCOx, uint32_t RCC_MCOSource, uint32_t RCC_M assert_param(IS_RCC_MCO(RCC_MCOx)); assert_param(IS_RCC_MCODIV(RCC_MCODiv)); /* RCC_MCO1 */ - if(RCC_MCOx == RCC_MCO1) + if (RCC_MCOx == RCC_MCO1) { assert_param(IS_RCC_MCO1SOURCE(RCC_MCOSource)); @@ -990,7 +1011,7 @@ uint32_t HAL_RCC_GetSysClockFreq(void) case RCC_SYSCLKSOURCE_STATUS_HSI: /* HSI used as system clock source */ { sysclockfreq = HSI_VALUE; - break; + break; } case RCC_SYSCLKSOURCE_STATUS_HSE: /* HSE used as system clock source */ { @@ -1005,16 +1026,16 @@ uint32_t HAL_RCC_GetSysClockFreq(void) if (__HAL_RCC_GET_PLL_OSCSOURCE() != RCC_PLLCFGR_PLLSRC_HSI) { /* HSE used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSE_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSE_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } else { /* HSI used as PLL clock source */ - pllvco = (uint32_t) ((((uint64_t) HSI_VALUE * ((uint64_t) ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); + pllvco = (uint32_t)((((uint64_t) HSI_VALUE * ((uint64_t)((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos)))) / (uint64_t)pllm); } - pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1 ) *2); + pllp = ((((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >> RCC_PLLCFGR_PLLP_Pos) + 1) * 2); - sysclockfreq = pllvco/pllp; + sysclockfreq = pllvco / pllp; break; } default: @@ -1047,7 +1068,7 @@ uint32_t HAL_RCC_GetHCLKFreq(void) uint32_t HAL_RCC_GetPCLK1Freq(void) { /* Get HCLK source and Compute PCLK1 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1)>> RCC_CFGR_PPRE1_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE1) >> RCC_CFGR_PPRE1_Pos]); } /** @@ -1059,7 +1080,7 @@ uint32_t HAL_RCC_GetPCLK1Freq(void) uint32_t HAL_RCC_GetPCLK2Freq(void) { /* Get HCLK source and Compute PCLK2 frequency ---------------------------*/ - return (HAL_RCC_GetHCLKFreq()>> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2)>> RCC_CFGR_PPRE2_Pos]); + return (HAL_RCC_GetHCLKFreq() >> APBPrescTable[(RCC->CFGR & RCC_CFGR_PPRE2) >> RCC_CFGR_PPRE2_Pos]); } /** @@ -1075,11 +1096,11 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_LSI; /* Get the HSE configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSEBYP) == RCC_CR_HSEBYP) + if ((RCC->CR & RCC_CR_HSEBYP) == RCC_CR_HSEBYP) { RCC_OscInitStruct->HSEState = RCC_HSE_BYPASS; } - else if((RCC->CR &RCC_CR_HSEON) == RCC_CR_HSEON) + else if ((RCC->CR & RCC_CR_HSEON) == RCC_CR_HSEON) { RCC_OscInitStruct->HSEState = RCC_HSE_ON; } @@ -1089,7 +1110,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the HSI configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_HSION) == RCC_CR_HSION) + if ((RCC->CR & RCC_CR_HSION) == RCC_CR_HSION) { RCC_OscInitStruct->HSIState = RCC_HSI_ON; } @@ -1098,14 +1119,14 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) RCC_OscInitStruct->HSIState = RCC_HSI_OFF; } - RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR &RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); + RCC_OscInitStruct->HSICalibrationValue = (uint32_t)((RCC->CR & RCC_CR_HSITRIM) >> RCC_CR_HSITRIM_Pos); /* Get the LSE configuration -----------------------------------------------*/ - if((RCC->BDCR &RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) + if ((RCC->BDCR & RCC_BDCR_LSEBYP) == RCC_BDCR_LSEBYP) { RCC_OscInitStruct->LSEState = RCC_LSE_BYPASS; } - else if((RCC->BDCR &RCC_BDCR_LSEON) == RCC_BDCR_LSEON) + else if ((RCC->BDCR & RCC_BDCR_LSEON) == RCC_BDCR_LSEON) { RCC_OscInitStruct->LSEState = RCC_LSE_ON; } @@ -1115,7 +1136,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the LSI configuration -----------------------------------------------*/ - if((RCC->CSR &RCC_CSR_LSION) == RCC_CSR_LSION) + if ((RCC->CSR & RCC_CSR_LSION) == RCC_CSR_LSION) { RCC_OscInitStruct->LSIState = RCC_LSI_ON; } @@ -1125,7 +1146,7 @@ void HAL_RCC_GetOscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) } /* Get the PLL configuration -----------------------------------------------*/ - if((RCC->CR &RCC_CR_PLLON) == RCC_CR_PLLON) + if ((RCC->CR & RCC_CR_PLLON) == RCC_CR_PLLON) { RCC_OscInitStruct->PLL.PLLState = RCC_PLL_ON; } @@ -1180,7 +1201,7 @@ void HAL_RCC_GetClockConfig(RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t *pF void HAL_RCC_NMI_IRQHandler(void) { /* Check RCC CSSF flag */ - if(__HAL_RCC_GET_IT(RCC_IT_CSS)) + if (__HAL_RCC_GET_IT(RCC_IT_CSS)) { /* RCC Clock Security System interrupt user callback */ HAL_RCC_CSSCallback(); diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c index c4676923..29de7d5b 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim.c @@ -98,18 +98,22 @@ *** Callback registration *** ============================================= + [..] The compilation define USE_HAL_TIM_REGISTER_CALLBACKS when set to 1 allows the user to configure dynamically the driver callbacks. + [..] Use Function @ref HAL_TIM_RegisterCallback() to register a callback. @ref HAL_TIM_RegisterCallback() takes as parameters the HAL peripheral handle, the Callback ID and a pointer to the user callback function. + [..] Use function @ref HAL_TIM_UnRegisterCallback() to reset a callback to the default weak function. @ref HAL_TIM_UnRegisterCallback takes as parameters the HAL peripheral handle, and the Callback ID. + [..] These functions allow to register/unregister following callbacks: (+) Base_MspInitCallback : TIM Base Msp Init Callback. (+) Base_MspDeInitCallback : TIM Base Msp DeInit Callback. @@ -140,15 +144,18 @@ (+) BreakCallback : TIM Break Callback. (+) Break2Callback : TIM Break2 Callback. + [..] By default, after the Init and when the state is HAL_TIM_STATE_RESET all interrupt callbacks are set to the corresponding weak functions: examples @ref HAL_TIM_TriggerCallback(), @ref HAL_TIM_ErrorCallback(). + [..] Exception done for MspInit and MspDeInit functions that are reset to the legacy weak functionalities in the Init / DeInit only when these callbacks are null (not registered beforehand). If not, MspInit or MspDeInit are not null, the Init / DeInit keep and use the user MspInit / MspDeInit callbacks(registered beforehand) + [..] Callbacks can be registered / unregistered in HAL_TIM_STATE_READY state only. Exception done MspInit / MspDeInit that can be registered / unregistered in HAL_TIM_STATE_READY or HAL_TIM_STATE_RESET state, @@ -156,6 +163,7 @@ all interrupt callbacks are set to the corresponding weak functions: In that case first register the MspInit/MspDeInit user callbacks using @ref HAL_TIM_RegisterCallback() before calling DeInit or Init function. + [..] When The compilation define USE_HAL_TIM_REGISTER_CALLBACKS is set to 0 or not defined, the callback registration feature is not available and all callbacks are set to the corresponding weak functions. @@ -216,7 +224,7 @@ static void TIM_DMAPeriodElapsedHalfCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerCplt(DMA_HandleTypeDef *hdma); static void TIM_DMATriggerHalfCplt(DMA_HandleTypeDef *hdma); static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig); + TIM_SlaveConfigTypeDef *sSlaveConfig); /** * @} */ @@ -227,8 +235,8 @@ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, */ /** @defgroup TIM_Exported_Functions_Group1 TIM Time Base functions - * @brief Time Base functions - * + * @brief Time Base functions + * @verbatim ============================================================================== ##### Time Base functions ##### @@ -482,11 +490,11 @@ HAL_StatusTypeDef HAL_TIM_Base_Start_DMA(TIM_HandleTypeDef *htim, uint32_t *pDat /* Check the parameters */ assert_param(IS_TIM_DMA_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -559,8 +567,8 @@ HAL_StatusTypeDef HAL_TIM_Base_Stop_DMA(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group2 TIM Output Compare functions - * @brief TIM Output Compare functions - * + * @brief TIM Output Compare functions + * @verbatim ============================================================================== ##### TIM Output Compare functions ##### @@ -929,16 +937,16 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) */ HAL_StatusTypeDef HAL_TIM_OC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length) { - uint32_t tmpsmcr; + uint32_t tmpsmcr; /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1136,8 +1144,8 @@ HAL_StatusTypeDef HAL_TIM_OC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group3 TIM PWM functions - * @brief TIM PWM functions - * + * @brief TIM PWM functions + * @verbatim ============================================================================== ##### TIM PWM functions ##### @@ -1513,11 +1521,11 @@ HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channe /* Check the parameters */ assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -1714,8 +1722,8 @@ HAL_StatusTypeDef HAL_TIM_PWM_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel */ /** @defgroup TIM_Exported_Functions_Group4 TIM Input Capture functions - * @brief TIM Input Capture functions - * + * @brief TIM Input Capture functions + * @verbatim ============================================================================== ##### TIM Input Capture functions ##### @@ -2061,11 +2069,11 @@ HAL_StatusTypeDef HAL_TIM_IC_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel)); assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((pData == NULL) && (Length > 0U)) { @@ -2249,8 +2257,8 @@ HAL_StatusTypeDef HAL_TIM_IC_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group5 TIM One Pulse functions - * @brief TIM One Pulse functions - * + * @brief TIM One Pulse functions + * @verbatim ============================================================================== ##### TIM One Pulse functions ##### @@ -2563,8 +2571,8 @@ HAL_StatusTypeDef HAL_TIM_OnePulse_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Out */ /** @defgroup TIM_Exported_Functions_Group6 TIM Encoder functions - * @brief TIM Encoder functions - * + * @brief TIM Encoder functions + * @verbatim ============================================================================== ##### TIM Encoder functions ##### @@ -2609,15 +2617,15 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Init(TIM_HandleTypeDef *htim, TIM_Encoder_Ini } /* Check the parameters */ + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode)); assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision)); assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload)); - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); assert_param(IS_TIM_ENCODER_MODE(sConfig->EncoderMode)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC1Selection)); assert_param(IS_TIM_IC_SELECTION(sConfig->IC2Selection)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC1Polarity)); - assert_param(IS_TIM_IC_POLARITY(sConfig->IC2Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC1Polarity)); + assert_param(IS_TIM_ENCODERINPUT_POLARITY(sConfig->IC2Polarity)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC1Prescaler)); assert_param(IS_TIM_IC_PRESCALER(sConfig->IC2Prescaler)); assert_param(IS_TIM_IC_FILTER(sConfig->IC1Filter)); @@ -2775,7 +2783,7 @@ __weak void HAL_TIM_Encoder_MspDeInit(TIM_HandleTypeDef *htim) HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ switch (Channel) @@ -2819,7 +2827,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start(TIM_HandleTypeDef *htim, uint32_t Channe HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2865,7 +2873,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop(TIM_HandleTypeDef *htim, uint32_t Channel HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Enable the encoder interface channels */ /* Enable the capture compare Interrupts 1 and/or 2 */ @@ -2915,7 +2923,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_IT(TIM_HandleTypeDef *htim, uint32_t Cha HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_CC2_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -2966,16 +2974,17 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_IT(TIM_HandleTypeDef *htim, uint32_t Chan * @param Length The length of data to be transferred from TIM peripheral to memory. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, uint32_t *pData2, uint16_t Length) +HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData1, + uint32_t *pData2, uint16_t Length) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((((pData1 == NULL) || (pData2 == NULL))) && (Length > 0U)) { @@ -3103,7 +3112,7 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Ch HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Channel) { /* Check the parameters */ - assert_param(IS_TIM_DMA_CC_INSTANCE(htim->Instance)); + assert_param(IS_TIM_ENCODER_INTERFACE_INSTANCE(htim->Instance)); /* Disable the Input Capture channels 1 and 2 (in the EncoderInterface the two possible channels that can be used are TIM_CHANNEL_1 and TIM_CHANNEL_2) */ @@ -3149,8 +3158,8 @@ HAL_StatusTypeDef HAL_TIM_Encoder_Stop_DMA(TIM_HandleTypeDef *htim, uint32_t Cha * @} */ /** @defgroup TIM_Exported_Functions_Group7 TIM IRQ handler management - * @brief TIM IRQ handler management - * + * @brief TIM IRQ handler management + * @verbatim ============================================================================== ##### IRQ handler management ##### @@ -3363,8 +3372,8 @@ void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) */ /** @defgroup TIM_Exported_Functions_Group8 TIM Peripheral Control functions - * @brief TIM Peripheral Control functions - * + * @brief TIM Peripheral Control functions + * @verbatim ============================================================================== ##### Peripheral Control functions ##### @@ -3738,9 +3747,14 @@ HAL_StatusTypeDef HAL_TIM_PWM_ConfigChannel(TIM_HandleTypeDef *htim, * This parameter can be one of the following values: * @arg TIM_CHANNEL_1: TIM Channel 1 selected * @arg TIM_CHANNEL_2: TIM Channel 2 selected + * @note To output a waveform with a minimum delay user can enable the fast + * mode by calling the @ref __HAL_TIM_ENABLE_OCxFAST macro. Then CCx + * output is forced in response to the edge detection on TIx input, + * without taking in account the comparison. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, uint32_t OutputChannel, uint32_t InputChannel) +HAL_StatusTypeDef HAL_TIM_OnePulse_ConfigChannel(TIM_HandleTypeDef *htim, TIM_OnePulse_InitTypeDef *sConfig, + uint32_t OutputChannel, uint32_t InputChannel) { TIM_OC_InitTypeDef temp1; @@ -3894,11 +3908,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -3941,7 +3955,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC1]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC1], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3957,7 +3972,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC2]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC2], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3973,7 +3989,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC3]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC3], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -3989,7 +4006,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_CC4]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_CC4], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4005,7 +4023,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_COMMUTATION]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_COMMUTATION], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4021,7 +4040,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStart(TIM_HandleTypeDef *htim, uint32_t htim->hdma[TIM_DMA_ID_TRIGGER]->XferErrorCallback = TIM_DMAError ; /* Enable the DMA stream */ - if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) + if (HAL_DMA_Start_IT(htim->hdma[TIM_DMA_ID_TRIGGER], (uint32_t)BurstBuffer, + (uint32_t)&htim->Instance->DMAR, ((BurstLength) >> 8U) + 1U) != HAL_OK) { return HAL_ERROR; } @@ -4151,8 +4171,8 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_WriteStop(TIM_HandleTypeDef *htim, uint32_t B * @note This function should be used only when BurstLength is equal to DMA data transfer length. * @retval HAL status */ -HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, uint32_t BurstRequestSrc, - uint32_t *BurstBuffer, uint32_t BurstLength) +HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t BurstBaseAddress, + uint32_t BurstRequestSrc, uint32_t *BurstBuffer, uint32_t BurstLength) { /* Check the parameters */ assert_param(IS_TIM_DMABURST_INSTANCE(htim->Instance)); @@ -4160,11 +4180,11 @@ HAL_StatusTypeDef HAL_TIM_DMABurst_ReadStart(TIM_HandleTypeDef *htim, uint32_t B assert_param(IS_TIM_DMA_SOURCE(BurstRequestSrc)); assert_param(IS_TIM_DMA_LENGTH(BurstLength)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if ((BurstBuffer == NULL) && (BurstLength > 0U)) { @@ -4465,7 +4485,7 @@ HAL_StatusTypeDef HAL_TIM_ConfigOCrefClear(TIM_HandleTypeDef *htim, /* When OCRef clear feature is used with ETR source, ETR prescaler must be off */ if (sClearInputConfig->ClearInputPrescaler != TIM_CLEARINPUTPRESCALER_DIV1) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4780,9 +4800,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4810,7 +4830,7 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro(TIM_HandleTypeDef *htim, TIM_SlaveC * @retval HAL status */ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { /* Check the parameters */ assert_param(IS_TIM_SLAVE_INSTANCE(htim->Instance)); @@ -4821,9 +4841,9 @@ HAL_StatusTypeDef HAL_TIM_SlaveConfigSynchro_IT(TIM_HandleTypeDef *htim, htim->State = HAL_TIM_STATE_BUSY; - if(TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) + if (TIM_SlaveTimer_SetConfig(htim, sSlaveConfig) != HAL_OK) { - htim->State = HAL_TIM_STATE_READY; + htim->State = HAL_TIM_STATE_READY; __HAL_UNLOCK(htim); return HAL_ERROR; } @@ -4913,8 +4933,8 @@ uint32_t HAL_TIM_ReadCapturedValue(TIM_HandleTypeDef *htim, uint32_t Channel) */ /** @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions - * @brief TIM Callbacks functions - * + * @brief TIM Callbacks functions + * @verbatim ============================================================================== ##### TIM Callbacks functions ##### @@ -5118,7 +5138,8 @@ __weak void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim) * @param pCallback pointer to the callback function * @retval status */ -HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, pTIM_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_TIM_RegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_CallbackIDTypeDef CallbackID, + pTIM_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; @@ -5578,8 +5599,8 @@ HAL_StatusTypeDef HAL_TIM_UnRegisterCallback(TIM_HandleTypeDef *htim, HAL_TIM_Ca */ /** @defgroup TIM_Exported_Functions_Group10 TIM Peripheral State functions - * @brief TIM Peripheral State functions - * + * @brief TIM Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State functions ##### @@ -6365,7 +6386,7 @@ static void TIM_OC6_SetConfig(TIM_TypeDef *TIMx, * @retval None */ static HAL_StatusTypeDef TIM_SlaveTimer_SetConfig(TIM_HandleTypeDef *htim, - TIM_SlaveConfigTypeDef *sSlaveConfig) + TIM_SlaveConfigTypeDef *sSlaveConfig) { uint32_t tmpsmcr; uint32_t tmpccmr1; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c index 271f11ec..f2d976ae 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_tim_ex.c @@ -73,7 +73,7 @@ * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** -*/ + */ /* Includes ------------------------------------------------------------------*/ #include "stm32f7xx_hal.h" @@ -397,11 +397,11 @@ HAL_StatusTypeDef HAL_TIMEx_HallSensor_Start_DMA(TIM_HandleTypeDef *htim, uint32 /* Check the parameters */ assert_param(IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(htim->Instance)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -709,11 +709,11 @@ HAL_StatusTypeDef HAL_TIMEx_OCN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Chan /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1117,11 +1117,11 @@ HAL_StatusTypeDef HAL_TIMEx_PWMN_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Cha /* Check the parameters */ assert_param(IS_TIM_CCXN_INSTANCE(htim->Instance, Channel)); - if ((htim->State == HAL_TIM_STATE_BUSY)) + if (htim->State == HAL_TIM_STATE_BUSY) { return HAL_BUSY; } - else if ((htim->State == HAL_TIM_STATE_READY)) + else if (htim->State == HAL_TIM_STATE_READY) { if (((uint32_t)pData == 0U) && (Length > 0U)) { @@ -1466,7 +1466,8 @@ HAL_StatusTypeDef HAL_TIMEx_OnePulseN_Stop_IT(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1521,7 +1522,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent(TIM_HandleTypeDef *htim, uint32_t * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1577,7 +1579,8 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_IT(TIM_HandleTypeDef *htim, uint32 * @arg TIM_COMMUTATION_SOFTWARE: Commutation source is set by software using the COMG bit * @retval HAL status */ -HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, uint32_t CommutationSource) +HAL_StatusTypeDef HAL_TIMEx_ConfigCommutEvent_DMA(TIM_HandleTypeDef *htim, uint32_t InputTrigger, + uint32_t CommutationSource) { /* Check the parameters */ assert_param(IS_TIM_COMMUTATION_EVENT_INSTANCE(htim->Instance)); @@ -1632,7 +1635,7 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, uint32_t tmpsmcr; /* Check the parameters */ - assert_param(IS_TIM_SYNCHRO_INSTANCE(htim->Instance)); + assert_param(IS_TIM_MASTER_INSTANCE(htim->Instance)); assert_param(IS_TIM_TRGO_SOURCE(sMasterConfig->MasterOutputTrigger)); assert_param(IS_TIM_MSM_STATE(sMasterConfig->MasterSlaveMode)); @@ -1665,16 +1668,19 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, /* Select the TRGO source */ tmpcr2 |= sMasterConfig->MasterOutputTrigger; - /* Reset the MSM Bit */ - tmpsmcr &= ~TIM_SMCR_MSM; - /* Set master mode */ - tmpsmcr |= sMasterConfig->MasterSlaveMode; - /* Update TIMx CR2 */ htim->Instance->CR2 = tmpcr2; - /* Update TIMx SMCR */ - htim->Instance->SMCR = tmpsmcr; + if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) + { + /* Reset the MSM Bit */ + tmpsmcr &= ~TIM_SMCR_MSM; + /* Set master mode */ + tmpsmcr |= sMasterConfig->MasterSlaveMode; + + /* Update TIMx SMCR */ + htim->Instance->SMCR = tmpsmcr; + } /* Change the htim state */ htim->State = HAL_TIM_STATE_READY; @@ -1690,6 +1696,9 @@ HAL_StatusTypeDef HAL_TIMEx_MasterConfigSynchronization(TIM_HandleTypeDef *htim, * @param htim TIM handle * @param sBreakDeadTimeConfig pointer to a TIM_ConfigBreakDeadConfigTypeDef structure that * contains the BDTR Register configuration information for the TIM peripheral. + * @note Interrupts can be generated when an active level is detected on the + * break input, the break 2 input or the system break input. Break + * interrupt can be enabled by calling the @ref __HAL_TIM_ENABLE_IT macro. * @retval HAL status */ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakDeadTime(TIM_HandleTypeDef *htim, @@ -1763,10 +1772,10 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { uint32_t tmporx; - uint32_t bkin_enable_mask = 0U; - uint32_t bkin_polarity_mask = 0U; - uint32_t bkin_enable_bitpos = 0U; - uint32_t bkin_polarity_bitpos = 0U; + uint32_t bkin_enable_mask; + uint32_t bkin_polarity_mask; + uint32_t bkin_enable_bitpos; + uint32_t bkin_polarity_bitpos; /* Check the parameters */ assert_param(IS_TIM_BREAK_INSTANCE(htim->Instance)); @@ -1800,11 +1809,19 @@ HAL_StatusTypeDef HAL_TIMEx_ConfigBreakInput(TIM_HandleTypeDef *htim, { bkin_enable_mask = TIM1_AF1_BKDF1BKE; bkin_enable_bitpos = 8; + bkin_polarity_mask = 0U; + bkin_polarity_bitpos = 0U; break; } default: + { + bkin_enable_mask = 0U; + bkin_polarity_mask = 0U; + bkin_enable_bitpos = 0U; + bkin_polarity_bitpos = 0U; break; + } } switch (BreakInput) @@ -2054,7 +2071,7 @@ HAL_TIM_StateTypeDef HAL_TIMEx_HallSensor_GetState(TIM_HandleTypeDef *htim) */ /* Private functions ---------------------------------------------------------*/ -/** @defgroup TIMEx_Private_Functions TIM Extended Private Functions +/** @defgroup TIMEx_Private_Functions TIMEx Private Functions * @{ */ diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c index 76efbf84..25a901fe 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart.c @@ -326,7 +326,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -346,7 +345,6 @@ HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -393,7 +391,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -416,7 +413,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_Init(UART_HandleTypeDef *huart) /* Enable the Half-Duplex mode by setting the HDSEL bit in the CR3 register */ SET_BIT(huart->Instance->CR3, USART_CR3_HDSEL); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -481,7 +477,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -507,7 +502,6 @@ HAL_StatusTypeDef HAL_LIN_Init(UART_HandleTypeDef *huart, uint32_t BreakDetectLe /* Set the USART LIN Break detection length. */ MODIFY_REG(huart->Instance->CR2, USART_CR2_LBDL, BreakDetectLength); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -567,7 +561,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); /* Set the UART Communication parameters */ @@ -596,7 +589,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_Init(UART_HandleTypeDef *huart, uint8_t Add /* Set the wake up method by setting the WAKE bit in the CR1 register */ MODIFY_REG(huart->Instance->CR1, USART_CR1_WAKE, WakeUpMethod); - /* Enable the Peripheral */ __HAL_UART_ENABLE(huart); /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */ @@ -622,7 +614,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_BUSY; - /* Disable the Peripheral */ __HAL_UART_DISABLE(huart); huart->Instance->CR1 = 0x0U; @@ -645,7 +636,6 @@ HAL_StatusTypeDef HAL_UART_DeInit(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_RESET; huart->RxState = HAL_UART_STATE_RESET; - /* Process Unlock */ __HAL_UNLOCK(huart); return HAL_OK; @@ -704,18 +694,18 @@ __weak void HAL_UART_MspDeInit(UART_HandleTypeDef *huart) * @param pCallback pointer to the Callback function * @retval HAL status */ -HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, pUART_CallbackTypeDef pCallback) +HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_CallbackIDTypeDef CallbackID, + pUART_CallbackTypeDef pCallback) { HAL_StatusTypeDef status = HAL_OK; if (pCallback == NULL) { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; return HAL_ERROR; } - /* Process locked */ + __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_READY) @@ -768,10 +758,8 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -789,24 +777,19 @@ HAL_StatusTypeDef HAL_UART_RegisterCallback(UART_HandleTypeDef *huart, HAL_UART_ break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -837,7 +820,6 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR { HAL_StatusTypeDef status = HAL_OK; - /* Process locked */ __HAL_LOCK(huart); if (HAL_UART_STATE_READY == huart->gState) @@ -876,6 +858,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ break; +#if defined(USART_CR1_UESM) + case HAL_UART_WAKEUP_CB_ID : + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ + break; + +#endif /* USART_CR1_UESM */ case HAL_UART_MSPINIT_CB_ID : huart->MspInitCallback = HAL_UART_MspInit; /* Legacy weak MspInitCallback */ break; @@ -885,10 +873,8 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } @@ -906,24 +892,19 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR break; default : - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; break; } } else { - /* Update the error code */ huart->ErrorCode |= HAL_UART_ERROR_INVALID_CALLBACK; - /* Return error status */ status = HAL_ERROR; } - /* Release Lock */ __HAL_UNLOCK(huart); return status; @@ -992,6 +973,11 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR (+) HAL_UART_AbortCpltCallback() (+) HAL_UART_AbortTransmitCpltCallback() (+) HAL_UART_AbortReceiveCpltCallback() +#if defined(USART_CR1_UESM) + + (#) Wakeup from Stop mode Callback: + (+) HAL_UARTEx_WakeupCallback() +#endif (#) In Non-Blocking mode transfers, possible errors are split into 2 categories. Errors are handled as follows : @@ -1013,9 +999,12 @@ HAL_StatusTypeDef HAL_UART_UnRegisterCallback(UART_HandleTypeDef *huart, HAL_UAR /** * @brief Send an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1033,7 +1022,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1045,7 +1033,7 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u huart->TxXferSize = Size; huart->TxXferCount = Size; - /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ + /* In case of 9bits/No Parity transfer, pData needs to be handled as a uint16_t pointer */ if ((huart->Init.WordLength == UART_WORDLENGTH_9B) && (huart->Init.Parity == UART_PARITY_NONE)) { pdata8bits = NULL; @@ -1057,6 +1045,8 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u pdata16bits = NULL; } + __HAL_UNLOCK(huart); + while (huart->TxXferCount > 0U) { if (UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_TXE, RESET, tickstart, Timeout) != HAL_OK) @@ -1084,9 +1074,6 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /* At end of Tx process, restore huart->gState to Ready */ huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1097,9 +1084,12 @@ HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, u /** * @brief Receive an amount of data in blocking mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @param Timeout Timeout duration. * @retval HAL status */ @@ -1118,7 +1108,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->ErrorCode = HAL_UART_ERROR_NONE; @@ -1146,6 +1135,8 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui pdata16bits = NULL; } + __HAL_UNLOCK(huart); + /* as long as data have to be received */ while (huart->RxXferCount > 0U) { @@ -1169,9 +1160,6 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /* At end of Rx process, restore huart->RxState to Ready */ huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ - __HAL_UNLOCK(huart); - return HAL_OK; } else @@ -1182,9 +1170,12 @@ HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, ui /** * @brief Send an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1197,7 +1188,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1218,7 +1208,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData huart->TxISR = UART_TxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the Transmit Data Register Empty interrupt */ @@ -1234,9 +1223,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData /** * @brief Receive an amount of data in interrupt mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1249,7 +1241,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1276,7 +1267,6 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, huart->RxISR = UART_RxISR_8BIT; } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error interrupt and Data Register Not Empty interrupt */ @@ -1292,9 +1282,12 @@ HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, /** * @brief Send an amount of data in DMA mode. + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the sent data is handled as a set of u16. In this case, Size must indicate the number + * of u16 provided through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be sent. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be sent. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1307,7 +1300,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pTxBuffPtr = pData; @@ -1337,7 +1329,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1349,7 +1340,6 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat /* Clear the TC flag in the ICR register */ __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_TCF); - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the DMA transfer for transmit request by setting the DMAT bit @@ -1368,9 +1358,12 @@ HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pDat * @brief Receive an amount of data in DMA mode. * @note When the UART parity is enabled (PCE = 1), the received data contain * the parity bit (MSB position). + * @note When UART parity is not enabled (PCE = 0), and Word Length is configured to 9 bits (M1-M0 = 01), + * the received data is handled as a set of u16. In this case, Size must indicate the number + * of u16 available through pData. * @param huart UART handle. - * @param pData Pointer to data buffer. - * @param Size Amount of data to be received. + * @param pData Pointer to data buffer (u8 or u16 data elements). + * @param Size Amount of data elements (u8 or u16) to be received. * @retval HAL status */ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size) @@ -1383,7 +1376,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } - /* Process Locked */ __HAL_LOCK(huart); huart->pRxBuffPtr = pData; @@ -1412,7 +1404,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData /* Set error code to DMA */ huart->ErrorCode = HAL_UART_ERROR_DMA; - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Restore huart->gState to ready */ @@ -1421,7 +1412,6 @@ HAL_StatusTypeDef HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData return HAL_ERROR; } } - /* Process Unlocked */ __HAL_UNLOCK(huart); /* Enable the UART Parity Error Interrupt */ @@ -1452,7 +1442,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) const HAL_UART_StateTypeDef gstate = huart->gState; const HAL_UART_StateTypeDef rxstate = huart->RxState; - /* Process Locked */ __HAL_LOCK(huart); if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAT)) && @@ -1472,7 +1461,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) CLEAR_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1485,7 +1473,6 @@ HAL_StatusTypeDef HAL_UART_DMAPause(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); if (huart->gState == HAL_UART_STATE_BUSY_TX) @@ -1506,7 +1493,6 @@ HAL_StatusTypeDef HAL_UART_DMAResume(UART_HandleTypeDef *huart) SET_BIT(huart->Instance->CR3, USART_CR3_DMAR); } - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -1591,7 +1577,7 @@ HAL_StatusTypeDef HAL_UART_DMAStop(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) { /* Disable TXEIE, TCIE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1663,7 +1649,6 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Reset Handle ErrorCode to No Error */ huart->ErrorCode = HAL_UART_ERROR_NONE; return HAL_OK; @@ -1680,7 +1665,7 @@ HAL_StatusTypeDef HAL_UART_Abort(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) { /* Disable TXEIE and TCIE interrupts */ @@ -1732,7 +1717,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit(UART_HandleTypeDef *huart) * - Set handle State to READY * @note This procedure is executed in blocking mode : when exiting function, Abort is considered as completed. * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -1792,7 +1777,7 @@ HAL_StatusTypeDef HAL_UART_AbortReceive(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) { uint32_t abortcplt = 1U; @@ -1931,7 +1916,7 @@ HAL_StatusTypeDef HAL_UART_Abort_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) { /* Disable interrupts */ @@ -2015,7 +2000,7 @@ HAL_StatusTypeDef HAL_UART_AbortTransmit_IT(UART_HandleTypeDef *huart) * @note This procedure is executed in Interrupt mode, meaning that abort procedure could be * considered as completed only when user abort complete callback is executed (not when exiting function). * @retval HAL status -*/ + */ HAL_StatusTypeDef HAL_UART_AbortReceive_IT(UART_HandleTypeDef *huart) { /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */ @@ -2110,7 +2095,7 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) uint32_t errorcode; /* If no error occurs */ - errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE)); + errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE | USART_ISR_RTOF)); if (errorflags == 0U) { /* UART in mode Receiver ---------------------------------------------------*/ @@ -2164,10 +2149,18 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) huart->ErrorCode |= HAL_UART_ERROR_ORE; } - /* Call UART Error Call back function if need be --------------------------*/ + /* UART Receiver Timeout interrupt occurred ---------------------------------*/ + if (((isrflags & USART_ISR_RTOF) != 0U) && ((cr1its & USART_CR1_RTOIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + huart->ErrorCode |= HAL_UART_ERROR_RTO; + } + + /* Call UART Error Call back function if need be ----------------------------*/ if (huart->ErrorCode != HAL_UART_ERROR_NONE) { - /* UART in mode Receiver ---------------------------------------------------*/ + /* UART in mode Receiver --------------------------------------------------*/ if (((isrflags & USART_ISR_RXNE) != 0U) && ((cr1its & USART_CR1_RXNEIE) != 0U)) { @@ -2177,11 +2170,14 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) } } - /* If Overrun error occurs, or if any error occurs in DMA mode reception, - consider error as blocking */ + /* If Error is to be considered as blocking : + - Receiver Timeout error in Reception + - Overrun error in Reception + - any error occurs in DMA mode reception + */ errorcode = huart->ErrorCode; if ((HAL_IS_BIT_SET(huart->Instance->CR3, USART_CR3_DMAR)) || - ((errorcode & HAL_UART_ERROR_ORE) != 0U)) + ((errorcode & (HAL_UART_ERROR_RTO | HAL_UART_ERROR_ORE)) != 0U)) { /* Blocking error : transfer is aborted Set the UART state ready to be able to start again the process, @@ -2249,6 +2245,26 @@ void HAL_UART_IRQHandler(UART_HandleTypeDef *huart) return; } /* End if some error occurs */ +#if defined(USART_CR1_UESM) + + /* UART wakeup from Stop mode interrupt occurred ---------------------------*/ + if (((isrflags & USART_ISR_WUF) != 0U) && ((cr3its & USART_CR3_WUFIE) != 0U)) + { + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_WUF); + + /* UART Rx state is not reset as a reception process might be ongoing. + If UART handle state fields need to be reset to READY, this could be done in Wakeup callback */ + +#if (USE_HAL_UART_REGISTER_CALLBACKS == 1) + /* Call registered Wakeup Callback */ + huart->WakeupCallback(huart); +#else + /* Call legacy weak Wakeup Callback */ + HAL_UARTEx_WakeupCallback(huart); +#endif /* USE_HAL_UART_REGISTER_CALLBACKS */ + return; + } +#endif /* USART_CR1_UESM */ /* UART in mode Transmitter ------------------------------------------------*/ if (((isrflags & USART_ISR_TXE) != 0U) @@ -2390,6 +2406,23 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ } +#if defined(USART_CR1_UESM) +/** + * @brief UART wakeup from Stop mode callback. + * @param huart UART handle. + * @retval None + */ +__weak void HAL_UARTEx_WakeupCallback(UART_HandleTypeDef *huart) +{ + /* Prevent unused argument(s) compilation warning */ + UNUSED(huart); + + /* NOTE : This function should not be modified, when the callback is needed, + the HAL_UARTEx_WakeupCallback can be implemented in the user file. + */ +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -2403,6 +2436,9 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) =============================================================================== [..] This subsection provides a set of functions allowing to control the UART. + (+) HAL_UART_ReceiverTimeout_Config() API allows to configure the receiver timeout value on the fly + (+) HAL_UART_EnableReceiverTimeout() API enables the receiver timeout feature + (+) HAL_UART_DisableReceiverTimeout() API disables the receiver timeout feature (+) HAL_MultiProcessor_EnableMuteMode() API enables mute mode (+) HAL_MultiProcessor_DisableMuteMode() API disables mute mode (+) HAL_MultiProcessor_EnterMuteMode() API enters mute mode @@ -2416,6 +2452,82 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) * @{ */ +/** + * @brief Update on the fly the receiver timeout value in RTOR register. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @param TimeoutValue receiver timeout value in number of baud blocks. The timeout + * value must be less or equal to 0x0FFFFFFFF. + * @retval None + */ +void HAL_UART_ReceiverTimeout_Config(UART_HandleTypeDef *huart, uint32_t TimeoutValue) +{ + assert_param(IS_UART_RECEIVER_TIMEOUT_VALUE(TimeoutValue)); + MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, TimeoutValue); +} + +/** + * @brief Enable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_EnableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Set the USART RTOEN bit */ + SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + +/** + * @brief Disable the UART receiver timeout feature. + * @param huart Pointer to a UART_HandleTypeDef structure that contains + * the configuration information for the specified UART module. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UART_DisableReceiverTimeout(UART_HandleTypeDef *huart) +{ + if (huart->gState == HAL_UART_STATE_READY) + { + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Clear the USART RTOEN bit */ + CLEAR_BIT(huart->Instance->CR2, USART_CR2_RTOEN); + + huart->gState = HAL_UART_STATE_READY; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; + } + else + { + return HAL_BUSY; + } +} + /** * @brief Enable UART in mute mode (does not mean UART enters mute mode; * to enter mute mode, HAL_MultiProcessor_EnterMuteMode() API must be called). @@ -2424,7 +2536,6 @@ __weak void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2445,7 +2556,6 @@ HAL_StatusTypeDef HAL_MultiProcessor_EnableMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_MultiProcessor_DisableMuteMode(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2476,7 +2586,6 @@ void HAL_MultiProcessor_EnterMuteMode(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2488,7 +2597,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2501,7 +2609,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableTransmitter(UART_HandleTypeDef *huart) */ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) { - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2513,7 +2620,6 @@ HAL_StatusTypeDef HAL_HalfDuplex_EnableReceiver(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2530,7 +2636,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) /* Check the parameters */ assert_param(IS_UART_LIN_INSTANCE(huart->Instance)); - /* Process Locked */ __HAL_LOCK(huart); huart->gState = HAL_UART_STATE_BUSY; @@ -2540,7 +2645,6 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) huart->gState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2551,8 +2655,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ /** @defgroup UART_Exported_Functions_Group4 Peripheral State and Error functions - * @brief UART Peripheral State functions - * + * @brief UART Peripheral State functions + * @verbatim ============================================================================== ##### Peripheral State and Error functions ##### @@ -2574,7 +2678,8 @@ HAL_StatusTypeDef HAL_LIN_SendBreak(UART_HandleTypeDef *huart) */ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) { - uint32_t temp1, temp2; + uint32_t temp1; + uint32_t temp2; temp1 = huart->gState; temp2 = huart->RxState; @@ -2586,7 +2691,7 @@ HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart) * @param huart Pointer to a UART_HandleTypeDef structure that contains * the configuration information for the specified UART. * @retval UART Error Code -*/ + */ uint32_t HAL_UART_GetError(UART_HandleTypeDef *huart) { return huart->ErrorCode; @@ -2620,6 +2725,9 @@ void UART_InitCallbacksToDefault(UART_HandleTypeDef *huart) huart->AbortCpltCallback = HAL_UART_AbortCpltCallback; /* Legacy weak AbortCpltCallback */ huart->AbortTransmitCpltCallback = HAL_UART_AbortTransmitCpltCallback; /* Legacy weak AbortTransmitCpltCallback */ huart->AbortReceiveCpltCallback = HAL_UART_AbortReceiveCpltCallback; /* Legacy weak AbortReceiveCpltCallback */ +#if defined(USART_CR1_UESM) + huart->WakeupCallback = HAL_UARTEx_WakeupCallback; /* Legacy weak WakeupCallback */ +#endif /* USART_CR1_UESM */ } #endif /* USE_HAL_UART_REGISTER_CALLBACKS */ @@ -2636,6 +2744,7 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) UART_ClockSourceTypeDef clocksource; uint32_t usartdiv = 0x00000000U; HAL_StatusTypeDef ret = HAL_OK; + uint32_t pclk; /* Check the parameters */ assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); @@ -2683,21 +2792,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING8(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING8(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING8(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2720,21 +2831,23 @@ HAL_StatusTypeDef UART_SetConfig(UART_HandleTypeDef *huart) switch (clocksource) { case UART_CLOCKSOURCE_PCLK1: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK1Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK1Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_PCLK2: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetPCLK2Freq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetPCLK2Freq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_HSI: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HSI_VALUE, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_SYSCLK: - usartdiv = (uint16_t)(UART_DIV_SAMPLING16(HAL_RCC_GetSysClockFreq(), huart->Init.BaudRate)); + pclk = HAL_RCC_GetSysClockFreq(); + usartdiv = (uint16_t)(UART_DIV_SAMPLING16(pclk, huart->Init.BaudRate)); break; case UART_CLOCKSOURCE_LSE: usartdiv = (uint16_t)(UART_DIV_SAMPLING16(LSE_VALUE, huart->Init.BaudRate)); break; - case UART_CLOCKSOURCE_UNDEFINED: default: ret = HAL_ERROR; break; @@ -2858,12 +2971,24 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) return HAL_TIMEOUT; } } +#if defined(USART_ISR_REACK) + + /* Check if the Receiver is enabled */ + if ((huart->Instance->CR1 & USART_CR1_RE) == USART_CR1_RE) + { + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + /* Timeout occurred */ + return HAL_TIMEOUT; + } + } +#endif /* Initialize the UART State */ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_OK; @@ -2878,7 +3003,8 @@ HAL_StatusTypeDef UART_CheckIdleState(UART_HandleTypeDef *huart) * @param Timeout Timeout duration * @retval HAL status */ -HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, uint32_t Tickstart, uint32_t Timeout) +HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_t Flag, FlagStatus Status, + uint32_t Tickstart, uint32_t Timeout) { /* Wait until flag is set */ while ((__HAL_UART_GET_FLAG(huart, Flag) ? SET : RESET) == Status) @@ -2895,11 +3021,32 @@ HAL_StatusTypeDef UART_WaitOnFlagUntilTimeout(UART_HandleTypeDef *huart, uint32_ huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; - /* Process Unlocked */ __HAL_UNLOCK(huart); return HAL_TIMEOUT; } + + if (READ_BIT(huart->Instance->CR1, USART_CR1_RE) != 0U) + { + if (__HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF) == SET) + { + /* Clear Receiver Timeout flag*/ + __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_RTOF); + + /* Disable TXE, RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts for the interrupt process */ + CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE | USART_CR1_TXEIE)); + CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE); + + huart->gState = HAL_UART_STATE_READY; + huart->RxState = HAL_UART_STATE_READY; + huart->ErrorCode = HAL_UART_ERROR_RTO; + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_TIMEOUT; + } + } } } return HAL_OK; diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c index 415fb56b..fcbcf4fd 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_uart_ex.c @@ -57,6 +57,9 @@ /** @defgroup UARTEx_Private_Functions UARTEx Private Functions * @{ */ +#if defined(USART_CR1_UESM) +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection); +#endif /* USART_CR1_UESM */ /** * @} */ @@ -144,7 +147,8 @@ * oversampling rate). * @retval HAL status */ -HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime) +HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, + uint32_t DeassertionTime) { uint32_t temp; @@ -224,42 +228,74 @@ HAL_StatusTypeDef HAL_RS485Ex_Init(UART_HandleTypeDef *huart, uint32_t Polarity, * @} */ -/** @defgroup UARTEx_Exported_Functions_Group2 IO operation functions - * @brief Extended functions - * -@verbatim - =============================================================================== - ##### IO operation functions ##### - =============================================================================== - This subsection provides a set of Wakeup and FIFO mode related callback functions. - -@endverbatim - * @{ - */ - - -/** - * @} - */ /** @defgroup UARTEx_Exported_Functions_Group3 Peripheral Control functions * @brief Extended Peripheral Control functions - * + * @verbatim =============================================================================== ##### Peripheral Control functions ##### =============================================================================== [..] This section provides the following functions: + (+) HAL_UARTEx_EnableClockStopMode() API enables the UART clock (HSI or LSE only) during stop mode + (+) HAL_UARTEx_DisableClockStopMode() API disables the above functionality (+) HAL_MultiProcessorEx_AddressLength_Set() API optionally sets the UART node address detection length to more than 4 bits for multiprocessor address mark wake up. +#if defined(USART_CR1_UESM) + (+) HAL_UARTEx_StopModeWakeUpSourceConfig() API defines the wake-up from stop mode + trigger: address match, Start Bit detection or RXNE bit status. + (+) HAL_UARTEx_EnableStopMode() API enables the UART to wake up the MCU from stop mode + (+) HAL_UARTEx_DisableStopMode() API disables the above functionality +#endif @endverbatim * @{ */ +#if defined(USART_CR3_UCESM) +/** + * @brief Keep UART Clock enabled when in Stop Mode. + * @note When the USART clock source is configured to be LSE or HSI, it is possible to keep enabled + * this clock during STOP mode by setting the UCESM bit in USART_CR3 control register. + * @note When LPUART is used to wakeup from stop with LSE is selected as LPUART clock source, + * and desired baud rate is 9600 baud, the bit UCESM bit in LPUART_CR3 control register must be set. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + /* Set UCESM bit */ + SET_BIT(huart->Instance->CR3, USART_CR3_UCESM); + /* Process Unlocked */ + __HAL_UNLOCK(huart); + return HAL_OK; +} + +/** + * @brief Disable UART Clock when in Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableClockStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UCESM bit */ + CLEAR_BIT(huart->Instance->CR3, USART_CR3_UCESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR3_UCESM */ /** * @brief By default in multiprocessor mode, when the wake up method is set * to address mark, the UART handles only 4-bit long addresses detection; @@ -299,8 +335,108 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua return (UART_CheckIdleState(huart)); } +#if defined(USART_CR1_UESM) +/** + * @brief Set Wakeup from Stop mode interrupt flag selection. + * @note It is the application responsibility to enable the interrupt used as + * usart_wkup interrupt source before entering low-power mode. + * @param huart UART handle. + * @param WakeUpSelection Address match, Start Bit detection or RXNE/RXFNE bit status. + * This parameter can be one of the following values: + * @arg @ref UART_WAKEUP_ON_ADDRESS + * @arg @ref UART_WAKEUP_ON_STARTBIT + * @arg @ref UART_WAKEUP_ON_READDATA_NONEMPTY + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_StopModeWakeUpSourceConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + HAL_StatusTypeDef status = HAL_OK; + uint32_t tickstart; + /* check the wake-up from stop mode UART instance */ + assert_param(IS_UART_WAKEUP_FROMSTOP_INSTANCE(huart->Instance)); + /* check the wake-up selection parameter */ + assert_param(IS_UART_WAKEUP_SELECTION(WakeUpSelection.WakeUpEvent)); + /* Process Locked */ + __HAL_LOCK(huart); + + huart->gState = HAL_UART_STATE_BUSY; + + /* Disable the Peripheral */ + __HAL_UART_DISABLE(huart); + + /* Set the wake-up selection scheme */ + MODIFY_REG(huart->Instance->CR3, USART_CR3_WUS, WakeUpSelection.WakeUpEvent); + + if (WakeUpSelection.WakeUpEvent == UART_WAKEUP_ON_ADDRESS) + { + UARTEx_Wakeup_AddressConfig(huart, WakeUpSelection); + } + + /* Enable the Peripheral */ + __HAL_UART_ENABLE(huart); + + /* Init tickstart for timeout managment*/ + tickstart = HAL_GetTick(); + + /* Wait until REACK flag is set */ + if (UART_WaitOnFlagUntilTimeout(huart, USART_ISR_REACK, RESET, tickstart, HAL_UART_TIMEOUT_VALUE) != HAL_OK) + { + status = HAL_TIMEOUT; + } + else + { + /* Initialize the UART State */ + huart->gState = HAL_UART_STATE_READY; + } + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return status; +} + +/** + * @brief Enable UART Stop Mode. + * @note The UART is able to wake up the MCU from Stop 1 mode as long as UART clock is HSI or LSE. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_EnableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Set UESM bit */ + SET_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +/** + * @brief Disable UART Stop Mode. + * @param huart UART handle. + * @retval HAL status + */ +HAL_StatusTypeDef HAL_UARTEx_DisableStopMode(UART_HandleTypeDef *huart) +{ + /* Process Locked */ + __HAL_LOCK(huart); + + /* Clear UESM bit */ + CLEAR_BIT(huart->Instance->CR1, USART_CR1_UESM); + + /* Process Unlocked */ + __HAL_UNLOCK(huart); + + return HAL_OK; +} + +#endif /* USART_CR1_UESM */ /** * @} */ @@ -312,6 +448,25 @@ HAL_StatusTypeDef HAL_MultiProcessorEx_AddressLength_Set(UART_HandleTypeDef *hua /** @addtogroup UARTEx_Private_Functions * @{ */ +#if defined(USART_CR1_UESM) + +/** + * @brief Initialize the UART wake-up from stop mode parameters when triggered by address detection. + * @param huart UART handle. + * @param WakeUpSelection UART wake up from stop mode parameters. + * @retval None + */ +static void UARTEx_Wakeup_AddressConfig(UART_HandleTypeDef *huart, UART_WakeUpTypeDef WakeUpSelection) +{ + assert_param(IS_UART_ADDRESSLENGTH_DETECT(WakeUpSelection.AddressLength)); + + /* Set the USART address length */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADDM7, WakeUpSelection.AddressLength); + + /* Set the USART address node */ + MODIFY_REG(huart->Instance->CR2, USART_CR2_ADD, ((uint32_t)WakeUpSelection.Address << UART_CR2_ADDRESS_LSB_POS)); +} +#endif /* USART_CR1_UESM */ /** * @} diff --git a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/system_stm32f7xx.c b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/system_stm32f7xx.c index cb4e5662..7282bc83 100644 --- a/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/system_stm32f7xx.c +++ b/Target/Demo/ARMCM7_STM32F7_Nucleo_F746ZG_TrueStudio/Prog/lib/system_stm32f7xx.c @@ -1,278 +1,244 @@ -/** - ****************************************************************************** - * @file system_stm32f7xx.c - * @author MCD Application Team - * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. - * - * This file provides two functions and one global variable to be called from - * user application: - * - SystemInit(): This function is called at startup just after reset and - * before branch to main program. This call is made inside - * the "startup_stm32f7xx.s" file. - * - * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used - * by the user application to setup the SysTick - * timer or configure other parameters. - * - * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must - * be called whenever the core clock is changed - * during program execution. - * - * - ****************************************************************************** - * @attention - * - *

© COPYRIGHT 2016 STMicroelectronics

- * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup CMSIS - * @{ - */ - -/** @addtogroup stm32f7xx_system - * @{ - */ - -/** @addtogroup STM32F7xx_System_Private_Includes - * @{ - */ - -#include "stm32f7xx.h" - -#if !defined (HSE_VALUE) - #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ -#endif /* HSE_VALUE */ - -#if !defined (HSI_VALUE) - #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ -#endif /* HSI_VALUE */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Defines - * @{ - */ - -/************************* Miscellaneous Configuration ************************/ - -/*!< Uncomment the following line if you need to relocate your vector Table in - Internal SRAM. */ -/* #define VECT_TAB_SRAM */ -#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. - This value must be a multiple of 0x200. */ -/******************************************************************************/ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Variables - * @{ - */ - - /* This variable is updated in three ways: - 1) by calling CMSIS function SystemCoreClockUpdate() - 2) by calling HAL API function HAL_RCC_GetHCLKFreq() - 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency - Note: If you use this function to configure the system clock; then there - is no need to call the 2 first functions listed above, since SystemCoreClock - variable is updated automatically. - */ - uint32_t SystemCoreClock = 16000000; - const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes - * @{ - */ - -/** - * @} - */ - -/** @addtogroup STM32F7xx_System_Private_Functions - * @{ - */ - -/** - * @brief Setup the microcontroller system - * Initialize the Embedded Flash Interface, the PLL and update the - * SystemFrequency variable. - * @param None - * @retval None - */ -void SystemInit(void) -{ - /* FPU settings ------------------------------------------------------------*/ - #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) - SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ - #endif - /* Reset the RCC clock configuration to the default reset state ------------*/ - /* Set HSION bit */ - RCC->CR |= (uint32_t)0x00000001; - - /* Reset CFGR register */ - RCC->CFGR = 0x00000000; - - /* Reset HSEON, CSSON and PLLON bits */ - RCC->CR &= (uint32_t)0xFEF6FFFF; - - /* Reset PLLCFGR register */ - RCC->PLLCFGR = 0x24003010; - - /* Reset HSEBYP bit */ - RCC->CR &= (uint32_t)0xFFFBFFFF; - - /* Disable all interrupts */ - RCC->CIR = 0x00000000; - - /* Configure the Vector Table location add offset address ------------------*/ -#ifdef VECT_TAB_SRAM - SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ -#else - SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ -#endif -} - -/** - * @brief Update SystemCoreClock variable according to Clock Register Values. - * The SystemCoreClock variable contains the core clock (HCLK), it can - * be used by the user application to setup the SysTick timer or configure - * other parameters. - * - * @note Each time the core clock (HCLK) changes, this function must be called - * to update SystemCoreClock variable value. Otherwise, any configuration - * based on this variable will be incorrect. - * - * @note - The system frequency computed by this function is not the real - * frequency in the chip. It is calculated based on the predefined - * constant and the selected clock source: - * - * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) - * - * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) - * - * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) - * or HSI_VALUE(*) multiplied/divided by the PLL factors. - * - * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 16 MHz) but the real value may vary depending on the variations - * in voltage and temperature. - * - * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value - * 25 MHz), user has to ensure that HSE_VALUE is same as the real - * frequency of the crystal used. Otherwise, this function may - * have wrong result. - * - * - The result of this function could be not correct when using fractional - * value for HSE crystal. - * - * @param None - * @retval None - */ -void SystemCoreClockUpdate(void) -{ - uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; - - /* Get SYSCLK source -------------------------------------------------------*/ - tmp = RCC->CFGR & RCC_CFGR_SWS; - - switch (tmp) - { - case 0x00: /* HSI used as system clock source */ - SystemCoreClock = HSI_VALUE; - break; - case 0x04: /* HSE used as system clock source */ - SystemCoreClock = HSE_VALUE; - break; - case 0x08: /* PLL used as system clock source */ - - /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N - SYSCLK = PLL_VCO / PLL_P - */ - pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; - pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; - - if (pllsource != 0) - { - /* HSE used as PLL clock source */ - pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - else - { - /* HSI used as PLL clock source */ - pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); - } - - pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; - SystemCoreClock = pllvco/pllp; - break; - default: - SystemCoreClock = HSI_VALUE; - break; - } - /* Compute HCLK frequency --------------------------------------------------*/ - /* Get HCLK prescaler */ - tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; - /* HCLK frequency */ - SystemCoreClock >>= tmp; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +/** + ****************************************************************************** + * @file system_stm32f7xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M7 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f7xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

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

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f7xx_system + * @{ + */ + +/** @addtogroup STM32F7xx_System_Private_Includes + * @{ + */ + +#include "stm32f7xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Variables + * @{ + */ + + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000; + const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F7xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemFrequency variable. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ +#endif + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = RAMDTCM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f7xx_hal_conf.h file (default value + * 25 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/