Drivere pentru strat inferior UM3029
Informații despre produs
Produsul este un set de drivere HAL (Hardware Abstraction Layer).
pentru microcontrolere STM32C0. Driverele HAL constau dintr-un set de
funcţii care acoperă cele mai comune caracteristici periferice şi sunt
conceput pentru a oferi un set bogat de API-uri și pentru a interacționa cu ușurință
straturile superioare de aplicare. Fiecare driver este condus de un API comun
care standardizează structura, funcțiile și parametrul driverului
nume. Driverele HAL includ un set de module driver, fiecare modul
fiind conectat la un mod periferic sau funcțional autonom.
Acronime și definiții
| Acronim | Definiţie |
|---|---|
| ADC | Convertor analog-digital |
| ANSI | Institutul național american de standarde |
| API | Interfață de programare a aplicației |
| BSP | Pachet de suport pentru bord |
| CMSIS | Standard de interfață software pentru microcontrolerul Cortex |
| CPU | Unitate centrală de procesare |
| CRC | Unitate de calcul CRC |
| CSS | Sistem de securitate cu ceas |
| DLYB | Blocare întârziere |
| DMA | Acces direct la memorie |
| DMAMUX | Cronometru cu control avansat, de uz general sau de bază |
| EXTI | Receptor/transmițător asincron universal |
| FLASH | Receptor/transmițător sincron universal |
| GPIO | Voltagtamponul de referință |
| HAL | Stratul de abstracție hardware |
| I2C | Circuitul inter-integrat |
| I2S | Sunet Interchip integrat |
| ICACHE | Cache de instrucțiuni |
| IRDA | Asocierea datelor în infraroșu |
| IWDG | Câine de pază independent |
| MCO | Ieșire ceas microcontroler |
| MPU | Unitate de protecție a memoriei |
| MSP | Indicatorul principal al stivei |
| NVIC | Controler de întrerupere cu vector imbricat |
| PPP | Numele driverului perifericului/modulului |
| PWR | Controlul puterii |
| RCC | Resetarea și controlul ceasului |
| RTC | Ceas în timp real |
| SMBUS | Bus de management al sistemului |
| SPI | Interfață periferică serială |
| SRAM | Memorie statică cu acces aleatoriu |
| SysTick | Cronometrul de bifare a sistemului |
| TIM | Cronometru |
| UART | Receptor/transmițător asincron universal |
| USART | Receptor/transmițător sincron universal |
| VREFBUF | Voltagtamponul de referință |
| WWDG | Câinele de pază pentru fereastră |
Instrucțiuni de utilizare a produsului
Pentru a utiliza produsul, urmați acești pași:
- Descărcați și instalați software-ul necesar din
STMicroelectronics website-ul. - Includeți driverul HAL necesar files în proiectul dvs., cum ar fi
stm32c0xx_hal_ppp.c, stm32c0xx_hal_ppp.h, stm32c0xx_hal_ppp_ex.c,
și stm32c0xx_hal_ppp_ex.h. - Inițializați driverele HAL utilizând stm32c0xx_hal.c și
stm32c0xx_hal.h files. - Utilizați API-urile standardizate furnizate de driverele HAL pentru a
interacționează cu perifericele de pe microcontrolerul STM32C0. - Consultați manualul de utilizare pentru informații suplimentare despre anumite
API-uri și caracteristici periferice.
UM3029
Manual de utilizare
Descrierea driverelor STM32C0 HAL și de nivel inferior
Introducere
STM32Cube este o inițiativă originală STMicroelectronics pentru a îmbunătăți semnificativ productivitatea dezvoltatorilor prin reducerea efortului, timpului și costurilor de dezvoltare. STM32Cube acoperă portofoliul STM32. STM32Cube include: · STM32CubeMX, un instrument de configurare software grafic care permite generarea codului de inițializare C folosind
vrăjitorii. · O platformă software încorporată completă, livrată pe serie (cum ar fi STM32CubeC0 pentru seria STM32C0)
Software-ul încorporat STM32Cube HAL, stratul de abstractizare STM32 care asigură o portabilitate maximizată în portofoliul STM32. API-urile HAL sunt disponibile pentru toate perifericele.
API-uri low-layer (LL) care oferă un strat rapid, ușor, orientat către experți, care este mai aproape de hardware decât HAL. API-urile LL sunt disponibile numai pentru un set de periferice.
Un set consistent de componente middleware, cum ar fi Azure® RTOS ThreadX, FileX și LevelX Stratul de driver HAL oferă un set de API-uri (interfețe de programare a aplicațiilor) simplu, generic, cu mai multe instanțe, pentru a interacționa cu stratul superior (aplicație, biblioteci și stive). API-urile driverului HAL sunt împărțite în două categorii: API-uri generice, care oferă funcții comune și generice pentru toate seria STM32 și API-urile de extensie, care includ funcții specifice și personalizate pentru o linie dată sau un număr de piesă. Driverele HAL includ un set complet de API-uri gata de utilizare care simplifică implementarea aplicației utilizator. De exampperifericele de comunicație conțin API-uri pentru inițializarea și configurarea perifericului, gestionarea transferurilor de date în modul de interogare, gestionarea întreruperilor sau DMA și gestionarea erorilor de comunicare. Driverele HAL sunt orientate spre caracteristici, nu pe IP. De exampAPI-urile temporizatorului sunt împărțite în mai multe categorii după funcțiile IP, cum ar fi cronometrul de bază, captarea și modularea lățimii impulsului (PWM). Stratul de driver HAL implementează detectarea defecțiunilor în timpul rulării prin verificarea valorilor de intrare ale tuturor funcțiilor. O astfel de verificare dinamică îmbunătățește robustețea firmware-ului. Detectarea timpului de execuție este, de asemenea, potrivită pentru dezvoltarea și depanarea aplicațiilor utilizatorilor. Driverele LL oferă servicii hardware bazate pe caracteristicile disponibile ale perifericelor STM32. Aceste servicii reflectă exact capacitățile hardware și oferă operațiuni atomice care trebuie apelate urmând modelul de programare descris în manualul de referință al liniei de produse. Drept urmare, serviciile LL nu se bazează pe procese autonome și nu necesită resurse de memorie suplimentare pentru a-și salva stările, contorul sau indicatorii de date. Toate operațiunile sunt efectuate prin modificarea conținutului registrelor periferice asociate. Spre deosebire de HAL, API-urile LL nu sunt furnizate pentru periferice pentru care accesul optimizat nu este o caracteristică cheie sau pentru cele care necesită o configurație de software grea și/sau o stivă complexă de nivel superior. HAL și LL sunt complementare și acoperă o gamă largă de cerințe de aplicație: · HAL oferă API-uri de nivel înalt și orientate spre caracteristici, cu un nivel de portabilitate ridicat. Acestea ascund MCU și perifericele
complexitate din partea utilizatorului final. · LL oferă API-uri de nivel scăzut la nivel de registru, cu o optimizare mai bună, dar mai puțină portabilitate. Acestea necesită cunoștințe profunde
MCU și specificațiile periferice. Codul sursă al driverului HAL și LL este dezvoltat în strict ANSI-C, ceea ce îl face independent de instrumentele de dezvoltare. Este verificat cu instrumentul de analiză statică CodeSonar®. Este pe deplin documentat. Sunt conforme cu standardul MISRA C®:2012. Acest manual de utilizare este structurat după cum urmează: · Pesteview de șoferi HAL · Pesteview de drivere de nivel inferior · Coabitarea driverelor HAL și LL · Descriere detaliată a fiecărui driver periferic: structuri de configurare, funcții și modul de utilizare a API-ului dat pentru a construi
aplicația dvs
UM3029 – Rev 1 – septembrie 2022 Pentru informații suplimentare, contactați biroul local de vânzări STMicroelectronics.
www.st.com
1
Nota:
UM3029
Informații generale
Informații generale
Pachetul MCU STM32CubeC0 rulează pe microcontrolere STM32C0 pe 32 de biți bazate pe procesorul Arm® Cortex®-M. Arm este o marcă înregistrată a Arm Limited (sau a filialelor sale) în SUA și/sau în altă parte.
UM3029 – Rev 1
pagina 2/1419
UM3029
Acronime și definiții
2
Acronime și definiții
Acronim ADC ANSI API BSP
CMSIS CPU CRC CSS DLYB DMA
DMAMUX EXTI FLASH GPIO HAL I2C I2S
ICACHE IRDA IWDG MCO MPU MSP NVIC PPP PWR RCC RTC
SMBUS SPI
SRAM SysTick
TIM UART USART VREFBUF WWDG
Tabelul 1. Acronime și definiții
Definiție Convertor analog-digital Institutul național american de standarde Interfață de programare a aplicațiilor
Pachet de suport pentru plăci standard de interfață software pentru microcontrolerul Cortex
Unitate centrală de procesare Unitate de calcul CRC Sistem de securitate ceas Blocare întârziere Acces direct la memorie
Multiplexor de solicitări de acces direct la memorie Controler extern de întrerupere/evenimente Memorie flash I/O de uz general Strat de abstractizare a hardware Circuit inter-integrat Sunet inter-integrat Cache de instrucțiuni Asociere de date în infraroșu Câine de pază independent Ieșire ceas microcontroler Unitate de protecție a memoriei Pachet specific MCU Controler de întrerupere cu vector imbricat Periferic STM32 sau blocați Controlerul de alimentare Resetarea și controlerul ceasului Ceas în timp real Magistrala de gestionare a sistemului Interfață periferică serială Memoria externă SRAM Temporizator de bifare a sistemului
Temporizator cu control avansat, de uz general sau de bază Receptor/emițător asincron universal Receptor/emițător sincron universal Vol.tagBufferul de referință Windog watchdog
UM3029 – Rev 1
pagina 3/1419
UM3029
Pesteview a șoferilor HAL
3
Pesteview a șoferilor HAL
Driverele HAL sunt proiectate pentru a oferi un set bogat de API-uri și pentru a interacționa cu ușurință cu straturile superioare ale aplicației.
Fiecare driver constă dintr-un set de funcții care acoperă cele mai comune caracteristici periferice. Dezvoltarea fiecărui driver este condusă de un API comun care standardizează structura driverului, funcțiile și numele parametrilor.
Driverele HAL includ un set de module driver, fiecare modul fiind conectat la un periferic independent. Cu toate acestea, în unele cazuri, modulul este conectat la un mod funcțional periferic. Ca un example, există mai multe module pentru perifericul USART: modul driver UART, modul driver USART, modul driver SMARTCARD și modul driver IRDA.
Principalele caracteristici ale HAL sunt următoarele:
· Set de API portabile pentru mai multe familii care acoperă caracteristicile periferice comune, precum și API-uri de extensie în cazul unor caracteristici periferice specifice.
· Trei modele de programare API: polling, întrerupere și DMA.
· API-urile sunt compatibile cu RTOS:
API-uri complet reintrante
Utilizarea sistematică a timeout-urilor în modul de sondare
· Suport pentru mai multe instanțe periferice, permițând apeluri API concurente pentru mai multe instanțe ale unui anumit periferic (cum ar fi USART1 sau USART2)
· Toate API-urile HAL implementează mecanismul de funcții de apel invers:
API-urile Peripheral Init/DeInit HAL pot apela funcții de apel invers pentru a efectua inițializarea/deinițializarea la nivel de sistem periferic (ceas, GPIO, întrerupere, DMA)
Perifericele întrerup evenimentele
Evenimente de eroare
· Mecanism de blocare a obiectelor: acces hardware sigur pentru a preveni accesele multiple false la resursele partajate.
· Timeout utilizat pentru toate procesele de blocare: timeout-ul poate fi un simplu contor sau o bază de timp.
UM3029 – Rev 1
pagina 4/1419
3.1
3.1.1
3.1.2
UM3029
HAL și aplicația utilizator files
HAL și aplicația utilizator files
șofer HAL files Driverele HAL sunt compuse din următorul set de files:
Tabelul 2. Driver HAL files
File
Descriere
stm32c0xx_hal_ppp.c
Driver principal periferic/modul file Include API-urile care sunt comune tuturor dispozitivelor STM32. Example: stm32c0xx_hal_adc.c, stm32c0xx_hal_irda.c.
stm32c0xx_hal_ppp.h
Antet file a conducătorului principal C file
Include date comune, structuri de gestionare și enumerare, declarații de definire și macrocomenzi, precum și API-uri generice exportate. Example:stm32c0xx_hal_adc.h,stm32c0xx_hal_irda.h.
stm32c0xx_hal_ppp_ex.c
Extensie file a unui driver de periferic/modul. Include API-urile specifice pentru un anumit număr de piesă sau familie, precum și API-urile nou definite care suprascriu API-urile generice implicite dacă procesul intern este implementat în mod diferit.
Example:stm32c0xx_hal_adc_ex.c,stm32c0xx_hal_flash_ex.c.
stm32c0xx_hal_ppp_ex.h
Antet file din extensia C file
Include datele specifice și structurile de enumerare, definirea declarațiilor și macrocomenzile, precum și API-urile specifice ale numărului de piesă al dispozitivului exportat Example: stm32c0xx_hal_adc_ex.h,stm32c0xx_hal_flash_ex.h.
stm32c0xx_hal.c stm32c0xx_hal.h
Acest file este utilizat pentru inițializarea HAL și conține DBGMCU, Remap și Time Delay bazate pe API-urile SysTick.
antet stm32c0xx_hal.c file
Șablon file pentru a fi copiat în folderul aplicației utilizator stm32c0xx_hal_msp_template.c Conține inițializarea și dezinițializarea MSP (rutina principală și apeluri inverse) ale
periferice utilizate în aplicația utilizator.
stm32c0xx_hal_conf_template.h Șablon file permițând personalizarea driverelor pentru o anumită aplicație
stm32c0xx_hal_def.h
Resurse HAL comune, cum ar fi declarații comune, enumerari, structuri și macrocomenzi
Utilizator-aplicație files Minimul fileElementele necesare pentru a construi o aplicație folosind HAL sunt listate în tabelul de mai jos:
Tabelul 3. Utilizator-aplicație files
File system_stm32c0xx.c
startup_stm32c0xx.s stm32c0xx_flash.icf
(opțional) stm32c0xx_hal_msp.c stm32c0xx_hal_conf.h
Descriere
Acest file conține SystemInit() care este apelat la pornire imediat după resetare și înainte de a se ramifica la programul principal. Nu configurează ceasul sistemului la pornire (contrar bibliotecii standard). Acest lucru trebuie făcut folosind API-urile HAL din utilizator files. Permite relocarea tabelului vectorial în SRAM intern.
Specific pentru lanțul de instrumente file care conține handler de resetare și vectori de excepție.
Pentru unele lanțuri de instrumente, permite adaptarea dimensiunii stivei/heap-ului pentru a se potrivi cerințelor aplicației.
Linker file pentru lanțul de instrumente EWARM, permițând în principal adaptarea dimensiunii stivei/heap-ului pentru a se potrivi cerințelor aplicației.
Acest file conține inițializarea și dezinițializarea MSP (rutina principală și apeluri inverse) a perifericului utilizat în aplicația utilizator.
Acest file permite utilizatorului să personalizeze driverele HAL pentru o anumită aplicație.
UM3029 – Rev 1
pagina 5/1419
Nota:
UM3029
HAL și aplicația utilizator files
File stm32c0xx_it.c/.h
principal.c/.h
Descriere Nu este obligatoriu modificarea acestei configurații. Aplicația poate folosi configurația implicită fără nicio modificare.
Acest file conţine manevrătorul de excepţii şi rutina de serviciu de întrerupere a perifericelor şi apelează HAL_IncTick() la intervale de timp regulate pentru a incrementa o variabilă locală (declarată în stm32c0xx_hal.c) utilizată ca bază de timp HAL. În mod implicit, această funcție este numită la fiecare 1 ms în Systick ISR. .
Rutina PPP_IRQHandler() trebuie să apeleze HAL_PPP_IRQHandler() dacă este utilizat un proces bazat pe întreruperi în cadrul aplicației.
Acest file conține rutina principală a programului, în principal: · Apel la implementarea HAL_Init() · implementarea assert_failed() · configurarea ceasului sistemului · inițializarea HAL periferică și codul aplicației utilizator.
Pachetul STM32Cube vine cu șabloane de proiect gata de utilizare, câte unul pentru fiecare placă acceptată. Fiecare proiect conține filesunt enumerate mai sus și un proiect preconfigurat pentru lanțurile de instrumente acceptate. Fiecare șablon de proiect oferă o funcție de buclă principală goală și poate fi folosit ca punct de plecare pentru a vă familiariza cu setările proiectului pentru STM32Cube. Caracteristicile sale sunt următoarele:
· Conține sursele driverelor HAL, CMSIS și BSP care sunt componentele minime pentru a dezvolta un cod pe o placă dată.
· Conține căile de includere pentru toate componentele firmware-ului. · Definește dispozitivul STM32 suportat și permite configurarea driverelor CMSIS și HAL în consecință. · Oferă utilizator gata de utilizare fileeste preconfigurat după cum este definit mai jos:
HAL este inițializat SysTick ISR implementat pentru ceasul de sistem HAL_GetTick() configurat cu frecvența dispozitivului selectat.
Dacă un proiect existent este copiat într-o altă locație, atunci include căile trebuie actualizate.
UM3029 – Rev 1
pagina 6/1419
Figura 1. Exampfișierul șablonului de proiect
UM3029
Structuri de date HAL
3.2
3.2.1
Structuri de date HAL
Fiecare driver HAL poate conține următoarele structuri de date: · Structuri de mâner periferice · Structuri de inițializare și configurare · Structuri de proces specifice.
Structuri de mâner periferice API-urile au o arhitectură multi-instanță generică modulară care permite lucrul cu mai multe instanțe IP simultan. PPP_HandleTypeDef *handle este structura principală care este implementată în driverele HAL. Se ocupă de configurația periferică/modul și înregistrează și înglobează toate structurile și variabilele necesare pentru a urmări fluxul dispozitivului periferic.
UM3029 – Rev 1
pagina 7/1419
Nota:
UM3029
Structuri de date HAL
Mânerul periferic este utilizat în următoarele scopuri:
· Suport multi-instanță: fiecare instanță de periferic/modul are propriul său mâner. Ca rezultat, resursele instanței sunt independente.
· Intercomunicarea proceselor periferice: mânerul este folosit pentru a gestiona resursele de date partajate între rutinele de proces. Example: indicatori globali, mânere DMA, mașină de stări.
· Stocare: acest mâner este folosit și pentru a gestiona variabilele globale într-un anumit driver HAL.
Un exampStructura periferică este prezentată mai jos:
typedef struct { USART_TypeDef *Instanță; /* USART înregistrează adresa de bază */ USART_InitTypeDef Init; /* Parametrii de comunicare Usart */ uint8_t *pTxBuffPtr;/* Pointer către tampon de transfer Usart Tx */ uint16_t TxXferSize; /* Usart Tx Transfer size */ __IO uint16_t TxXferCount;/* Usart Tx Transfer Counter */ uint8_t *pRxBuffPtr;/* Pointer la Usart Rx transfer Buffer */ uint16_t RxXferSize; /* Usart Rx Transfer size */ __IO uint16_t RxXferCount; /* Contor de transfer Usart Rx */ DMA_HandleTypeDef *hdmatx; /* Usart Tx DMA Handle parametri */ DMA_HandleTypeDef *hdmarx; /* Usart Rx DMA Handle parametri */ HAL_LockTypeDef Lock; /* Obiect de blocare */ __IO HAL_USART_StateTypeDef State; /* Starea comunicării Usart */ __IO HAL_USART_ErrorTypeDef ErrorCode;/* Cod de eroare USART */ }USART_HandleTypeDef;
1. Caracteristica multi-instanță implică faptul că toate API-urile utilizate în aplicație sunt reintrante și evită utilizarea variabilelor globale, deoarece subrutinele nu pot fi reintrante dacă se bazează pe o variabilă globală pentru a rămâne neschimbată, dar acea variabilă este modificată atunci când subrutinele sunt recursive. invocat. Din acest motiv, sunt respectate următoarele reguli: Codul reintrant nu deține date statice (sau globale) non-constante: funcțiile reintrante pot funcționa cu date globale. De example, o rutină de serviciu de întrerupere reintrată poate prelua o parte din starea hardware cu care să lucreze (de example serial port read buffer) care nu este doar global, ci și volatil. Cu toate acestea, utilizarea tipică a variabilelor statice și a datelor globale nu este recomandată, în sensul că numai instrucțiunile de readmodify-write ar trebui folosite în aceste variabile. Nu ar trebui să fie posibil ca o întrerupere sau un semnal să apară în timpul executării unei astfel de instrucțiuni. Codul reintrant nu își modifică propriul cod.
2. Când un periferic poate gestiona mai multe procese simultan folosind DMA (carcasă full duplex), mânerul de interfață DMA pentru fiecare proces este adăugat în PPP_HandleTypeDef.
3. Pentru perifericele partajate și de sistem, nu este utilizat niciun mâner sau obiect de instanță. Perifericele vizate de această excepție sunt următoarele: GPIO SYSTICK NVIC PWR RCC FLASH
UM3029 – Rev 1
pagina 8/1419
3.2.2
Notă: 3.2.3
UM3029
Structuri de date HAL
Structura de inițializare și configurare Aceste structuri sunt definite în antetul generic al driverului file când este comun tuturor numerelor de piesă. Când se pot schimba de la un număr de piesă la altul, structurile sunt definite în antetul extensiei file pentru fiecare număr de piesă.
typedef struct { uint32_t BaudRate; /*!< Acest membru configurează viteza de comunicare UART.*/ uint32_t WordLength; /*!< Specifică numărul de biți de date transmisi sau primiți într-un cadru.*/ uint32_t StopBits; /*!< Specifică numărul de biți de oprire transmiși.*/ uint32_t Paritate; /*!< Specifică modul de paritate. */ uint32_t Mode; /*!< Specifică dacă modul Recepție sau Transmitere este activat sau dezactivat.*/ uint32_t HwFlowCtl; /*!< Specifică dacă modul de control al fluxului hardware este activat sau dezactivat.*/ uint32_t OverSampling; /*!< Specifică dacă Over sampling 8 este activat sau dezactivat, pentru a obține o viteză mai mare (până la fPCLK/8).*/ }UART_InitTypeDef;
Structura de configurare este utilizată pentru a inițializa sub-modulele sau sub-instanțele. Vezi mai jos exampfișier: HAL_ADC_ConfigChannel (ADC_HandleTypeDef* hadc, ADC_ChannelConfTypeDef* sConfig)
Structuri de proces specifice Structurile de proces specifice sunt utilizate pentru procese specifice (API-uri comune). Ele sunt definite în antetul generic al driverului file. Examppe:
HAL_PPP_Process (PPP_HandleTypeDef* hadc, PPP_ProcessConfig* sConfig)
UM3029 – Rev 1
pagina 9/1419
3.3
Notă: Notă:
UM3029
Clasificare API
Clasificare API
API-urile HAL sunt clasificate în următoarele categorii:
· API-uri generice: API-uri generice comune care se aplică tuturor dispozitivelor STM32. Aceste API-uri sunt, prin urmare, prezente în driverul HAL generic filetoate microcontrolerele STM32.
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_DeInit(ADC_HandleTypeDef *hadc); HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_Stop(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_Start_IT(ADC_HandleTypeDef* hadc); HAL_StatusTypeDef HAL_ADC_Stop_IT(ADC_HandleTypeDef* hadc); void HAL_ADC_IRQHandler(ADC_HandleTypeDef* hadc);
· API-uri de extensie: acest set de API-uri este împărțit în două subcategorii:
API-uri specifice familiei: API-uri care se aplică unei anumite familii. Sunt localizate în driverul HAL de extensie file (vezi example de mai jos legate de ADC).
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef* hadc,uint32_t SingleDiff); uint32_t HAL_ADCEx_Calibration_GetValue(ADC_HandleTypeDef* hadc, uint32_t SingleDiff);
API-uri specifice funcției/dispozitivelor: aceste API-uri sunt implementate în extensie file și delimitate de declarații definite specifice referitoare la biții sau caracteristicile CMSIS și în funcție de numărul piesei dispozitivului.
Structura de date aferentă API-urilor specifice este delimitată de instrucțiunea de definire a numărului piesei dispozitivului. Este situat în antetul de extensie corespunzător C file. Următorul tabel rezumă locația diferitelor categorii de API-uri HAL în driver files.
API-uri comune API-uri specifice familiei API-uri specifice dispozitivului
Tabelul 4. Clasificare API Generic file X –
Extensie file XXX
API-urile specifice familiei sunt legate doar de o anumită familie. Aceasta înseamnă că, dacă un anumit API este implementat într-o altă familie, iar argumentele acestei din urmă familii sunt diferite, ar putea fi necesare structuri și argumente suplimentare. Manipulatorii IRQ sunt utilizați pentru procese comune și specifice familiei.
UM3029 – Rev 1
pagina 10/1419
3.4
UM3029
Dispozitive acceptate de driverele HAL
Dispozitive acceptate de driverele HAL
Tabelul 5. Lista dispozitivelor acceptate de driverele HAL
IP/module stm32c0xx_hal.c stm32c0xx_hal_adc.c stm32c0xx_hal_adc_ex.c stm32c0xx_hal_cortex.c stm32c0xx_hal_crc.c stm32c0xx_hal_crc_ex.c stm32c0xx_hal_dma.c stm32c0xx_hal_dma_ex.c stm32c0xx_hal_exti.c stm32c0xx_hal_flash.c stm32c0xx_hal_flash_ex.c stm32c0xx_hal_gpio.c stm32c0xx_hal_i2c.c stm32c0xx_hal_i2c_ex.c stm32c0xx_hal_i2s.c stm32c0xx_hal_irda.c stm32c0xx_hal_iwdg.c stm32c0xx_hal_msp_template.c stm32c0xx_hal_pwr.c stm32c0xx_hal_pwr_ex.c stm32c0xx_hal_rcc.c stm32c0xx_hal_rcc_ex.c stm32c0xx_hal_rtc.c stm32c0xx_hal_rtc_ex.c stm32c0xx_hal_smartcard.c stm32c0xx_hal_smartcard_ex.c stm32c0xx_hal_smbus.c stm32c0xx_hal_smbus_ex.c stm32c0xx_hal_spi.c stm32c0xx_hal_spi_ex.c stm32c0xx_hal_tim.c stm32c0xx_hal_tim_ex.c stm32c0xx_hal_uart.c stm32c0xx_hal_uart_ex.c stm32c0xx_hal_usart.c stm32c0xx_hal_usart_ex.c stm32c0xx_hal_wwdg.c
STM32C031xx Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da
STM32C011xx Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da Da
UM3029 – Rev 1
pagina 11/1419
UM3029
Regulile șoferului HAL
3.5
3.5.1
Regulile șoferului HAL
Reguli de denumire API HAL Următoarele reguli de denumire sunt utilizate în driverele HAL:
Tabelul 6. Reguli de denumire API HAL
File nume
Numele modulului
Numele funcției
Numele mânerului
Structura inițială
nume
Nume enumerare
Generic stm32c0xx_hal_ppp (c/h)
HAL_PPP_Function HAL_PPP_FeatureFunction_MODE
PPP_HandleTypedef PPP_InitTypeDef
HAL_PPP_StructnameTypeDef
API-uri specifice familiei stm32c0xx_hal_ppp_ex (c/h)
HAL_PPP_ MODULE HAL_PPPEx_Function HAL_PPPEx_FeatureFunction_MODE
NA
NA
NA
API-uri specifice dispozitivului stm32c0xx_ hal_ppp_ex (c/h)
HAL_PPPEx_Function HAL_PPPEx_FeatureFunction_MODE
NA PPP_InitTypeDef
NA
· Prefixul PPP se referă la modul funcțional periferic și nu la perifericul în sine. De example, dacă USART, PPP poate fi USART, IRDA, UART sau SMARTCARD în funcție de modul periferic.
· Constantele utilizate într-unul file sunt definite în cadrul acesteia file. O constantă folosită în mai multe files este definit într-un antet file. Toate constantele sunt scrise cu majuscule, cu excepția parametrilor funcției driverului periferic.
· numele variabilelor typedef trebuie sufixate cu _TypeDef.
· Registrele sunt considerate constante. În cele mai multe cazuri, numele lor este în majuscule și folosește aceleași acronime ca în manualele de referință STM32C0.
· Registrele periferice sunt declarate în structura PPP_TypeDef (de exampfișierul ADC_TypeDef) în antetul stm32c0xxx.h file:
stm32c0xxx.h corespunde stm32c031xx.h și stm32c011xx.h.
· Numele funcțiilor periferice sunt prefixate de HAL_, apoi acronimul periferic corespunzător în majuscule urmat de un caracter de subliniere. Prima literă a fiecărui cuvânt este cu majuscule (de exampfișierul HAL_UART_Transmit()). Este permisă o singură liniuță de subliniere într-un nume de funcție pentru a separa acronimul periferic de restul numelui funcției.
· Structura care conține parametrii de inițializare a perifericii PPP se numește PPP_InitTypeDef (de ex.ampfișierul ADC_InitTypeDef).
· Structura care conține parametrii de configurare specifici pentru perifericul PPP sunt denumite PPP_xxxxConfTypeDef (de ex.ampfișierul ADC_ChannelConfTypeDef).
· Structurile de mâner periferice sunt denumite PPP_HandleTypedef (de ex. DMA_HandleTypeDef)
· Funcțiile folosite pentru a inițializa perifericul PPP conform parametrilor specificați în PPP_InitTypeDef sunt denumite HAL_PPP_Init (de ex.ampfișierul HAL_TIM_Init()).
· Funcțiile utilizate pentru a reseta registrele periferice PPP la valorile implicite sunt denumite HAL_PPP_DeInit (de ex.ampfișierul HAL_TIM_DeInit()).
· Sufixul MOD se referă la modul proces, care poate fi interogare, întrerupere sau DMA. Ca un exampatunci când DMA este utilizat în plus față de resursele native, funcția ar trebui să fie numită: HAL_PPP_Function_DMA().
· Prefixul caracteristică ar trebui să se refere la noua caracteristică. Example: HAL_ADCEx_InjectedStart()() se referă la modul de injectare.
UM3029 – Rev 1
pagina 12/1419
UM3029
Regulile șoferului HAL
3.5.2 Notă:
Reguli generale de denumire HAL · Pentru perifericele partajate și de sistem, nu se utilizează niciun obiect de identificare sau de instanță. Această regulă se aplică la
urmatoarele periferice:
GPIO SYSTICK NVIC RCC FLASH Example: HAL_GPIO_Init() necesită doar adresa GPIO și parametrii săi de configurare.
HAL_StatusTypeDef HAL_GPIO_Init (GPIO_TypeDef* GPIOx, GPIO_InitTypeDef *Init) { /*corp de inițializare GPIO */ }
· Macro-urile care gestionează întreruperile și configurațiile specifice de ceas sunt definite în fiecare driver de periferic/modul. Aceste macrocomenzi sunt exportate în antetul driverului periferic files astfel încât să poată fi utilizate de extensie file. Lista acestor macrocomenzi este definită mai jos:
Această listă nu este exhaustivă și pot fi adăugate și alte macrocomenzi legate de caracteristicile periferice, astfel încât acestea să poată fi utilizate în aplicația utilizatorului.
Tabelul 7. Macro-urile care gestionează întreruperi și configurații specifice de ceas
Macro-uri
Descriere
__HAL_PPP_ENABLE_IT(__HANDLE__, __INTERRUPT__) Activează o anumită întrerupere periferică
__HAL_PPP_DISABLE_IT(__HANDLE__, __INTERRUPT__)
Dezactivează o anumită întrerupere periferică
__HAL_PPP_GET_IT (__HANDLE__, __ INTERRUPT __) Obține o stare de întrerupere periferică specifică
__HAL_PPP_CLEAR_IT (__HANDLE__, __ INTERRUPT __) Șterge o anumită stare de întrerupere periferică
__HAL_PPP_GET_FLAG (__HANDLE__, __FLAG__) Obține o stare specifică de semnalizare periferică
__HAL_PPP_CLEAR_FLAG (__HANDLE__, __FLAG__) Șterge o anumită stare de semnalizare periferică
__HAL_PPP_ENABLE(__HANDLE__)
Activează un periferic
__HAL_PPP_DISABLE(__HANDLE__)
Dezactivează un periferic
__HAL_PPP_XXXX (__HANDLE__, __PARAM__)
Macrocomandă specifică driverului PPP HAL
__HAL_PPP_GET_ IT_SOURCE (__HANDLE__, __ INTERRUPT __)
Verifică sursa întreruperii specificate
· NVIC și stm32c0xx_hal_cortex.c sunt două caracteristici de bază Arm® Cortex®. API-urile legate de aceste caracteristici se află în stm32c0xx_hal_cortex.c file.
· Când un bit de stare sau un flag este citit din registre, acesta este compus din valori deplasate în funcție de numărul de valori citite și de dimensiunea acestora. În acest caz, lățimea de stare returnată este de 32 de biți. Examppe:
STARE = XX | (YY << 16) sau STARE = XX | (AA << 8) | (YY << 16) | (YY << 24).
· Detaliile PPP sunt valide înainte de a utiliza API-ul HAL_PPP_Init(). Funcția init efectuează o verificare înainte de a modifica câmpurile de ghidare.
HAL_PPP_Init(PPP_HandleTypeDef) if(hppp == NULL)
{ returnează HAL_ERROR; }
UM3029 – Rev 1
pagina 13/1419
3.5.3
3.6
UM3029
API-uri generice HAL
· Sunt utilizate macrocomenzile definite mai jos: Macrocomandă condiționată:
#define ABS(x) (((x) > 0) ? (x) : -(x))
Pseudo-cod macrocomandă (macrocomandă cu mai multe instrucțiuni):
#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD_, __DMA_HANDLE_) do{ (__HANDLE__)->__PPP_DMA_FIELD_ = &(__DMA_HANDLE_); (__DMA_HANDLE_).Parent = (__HANDLE__); } în timp ce(0)
Funcții de gestionare a întreruperilor și apel invers HAL Pe lângă API-uri, driverele periferice HAL includ:
· HAL_PPP_IRQHandler() handler de întrerupere periferic care ar trebui apelat de la stm32c0xx_it.c · Funcții de apel invers pentru utilizator.
Funcțiile de apel invers de utilizator sunt definite ca funcții goale cu atribut „slab”. Acestea trebuie definite în codul utilizatorului. Există trei tipuri de funcții de apel invers de utilizator:
· Apeluri de inițializare/dezinițializare la nivel de sistem periferic: HAL_PPP_MspInit() și HAL_PPP_MspDeInit
· Procesați apelurile inverse complete: HAL_PPP_ProcessCpltCallback · Eroare apel invers: HAL_PPP_ErrorCallback.
Tabelul 8. Funcții de apel invers
Funcții de apel invers
Example
HAL_PPP_MspInit() / _DeInit()
Exampfișier: HAL_USART_MspInit()
Apelat de la funcția API HAL_PPP_Init() pentru a efectua inițializarea la nivel de sistem periferic (GPIO, ceas, DMA, întrerupere)
Exampfișier: HAL_USART_TxCpltCallback HAL_PPP_ProcessCpltCallback
Apelat de periferic sau de gestionare a întreruperii DMA când procesul se încheie
HAL_PPP_ErrorCallback
Exampfișier: HAL_USART_ErrorCallback Apelat de un periferic sau de gestionare a întreruperii DMA atunci când apare o eroare
API-uri generice HAL
API-urile generice oferă funcții generice comune care se aplică tuturor dispozitivelor STM32. Sunt compuse din patru grupuri de API-uri:
· Funcții de inițializare și dezinițializare: HAL_PPP_Init(), HAL_PPP_DeInit() · Funcții de operare IO: HAL_PPP_Read(), HAL_PPP_Write(),HAL_PPP_Transmit(), HAL_PPP_Receive() · Funcții de control: HAL_PPP_Set (_PPP_Set). · Funcții de stare și erori: HAL_PPP_GetState (), HAL_PPP_GetError ().
Pentru unele drivere de periferice/module, aceste grupuri sunt modificate în funcție de implementarea perifericelor/modulului.
Example: în driverul de temporizator, gruparea API se bazează pe caracteristicile temporizatorului (cum ar fi PWM, OC și IC).
Funcțiile de inițializare și dezinițializare permit inițializarea unui periferic și configurarea resurselor de nivel scăzut, în principal ceasuri, GPIO, funcții alternative (AF) și eventual DMA și întreruperi. Funcția HAL_DeInit() restabilește starea implicită periferică, eliberează resursele de nivel scăzut și elimină orice dependență directă de hardware.
Funcțiile de operare IO realizează un acces de rând la datele de sarcină utilă periferică în modurile de scriere și citire.
Funcțiile de control sunt folosite pentru a modifica dinamic configurația periferică și pentru a seta un alt mod de funcționare.
UM3029 – Rev 1
pagina 14/1419
3.7
3.7.1
UM3029
API-uri de extensie HAL
Funcțiile de stare periferică și erori permit regăsirea în timp de rulare a stărilor periferice și a fluxului de date și identificarea tipului de erori care au apărut. FostulampLe de mai jos se bazează pe perifericul ADC. Lista API-urilor generice nu este exhaustivă. Este dat doar ca example.
Tabelul 9. API-uri generice HAL
Grup de funcții Grup de inițializare
Grup de operare IO
Stare și erori ale grupului de control
grup
Nume comun API
Descriere
HAL_ADC_Init()
Această funcție inițializează perifericele și configurează resursele de nivel scăzut (ceasuri, GPIO, AF..)
HAL_ADC_DeInit()
Această funcție restabilește starea implicită periferică, eliberează resursele de nivel scăzut și elimină orice dependență directă de hardware.
HAL_ADC_Start ()
Această funcție pornește conversiile ADC atunci când este utilizată metoda de sondare
HAL_ADC_Stop ()
Această funcție oprește conversiile ADC atunci când este utilizată metoda de sondare
Această funcție permite așteptarea sfârșitului conversiilor atunci când este utilizată metoda de sondare HAL_ADC_PollForConversion(). În acest caz, o valoare de timeout este specificată de
utilizatorul conform aplicației.
HAL_ADC_Start_IT()
Această funcție pornește conversiile ADC atunci când este utilizată metoda de întrerupere
HAL_ADC_Stop_IT() HAL_ADC_IRQHandler()
Această funcție oprește conversiile ADC atunci când este utilizată metoda de întrerupere
Această funcție gestionează cererile de întrerupere ADC
HAL_ADC_ConvCpltCallback()
Funcția de apel invers apelată în subrutina IT pentru a indica sfârșitul procesului curent sau când s-a încheiat un transfer DMA
HAL_ADC_ErrorCallback()
Funcția de apel invers apelată în subrutina IT dacă a apărut o eroare periferică sau o eroare de transfer DMA
HAL_ADC_ConfigChannel()
Această funcție configurează canalul obișnuit ADC selectat, rangul corespunzător în secvențator și sample timp
HAL_ADC_AnalogWDGConfig Această funcție configurează watchdog-ul analogic pentru ADC-ul selectat
HAL_ADC_GetState()
Această funcție permite introducerea în timp de rulare a stărilor periferice și a fluxului de date.
HAL_ADC_GetError()
Această funcție permite introducerea în timpul de rulare a erorii apărute în timpul rutinei IT
API-uri de extensie HAL
Model de extensie HAL pesteview API-urile de extensie oferă funcții specifice sau suprascriu API-urile modificate pentru o anumită familie (serie) sau un anumit număr de piesă din cadrul aceleiași familii. Modelul de extensie constă dintr-un suplimentar file, stm32c0xx_hal_ppp_ex.c, care include toate funcțiile specifice și definirea declarațiilor (stm32c0xx_hal_ppp_ex.h) pentru un anumit număr de piesă. Mai jos un exampfișier bazat pe perifericul ADC:
Tabelul 10. API-uri de extensie HAL
Grup de funcții HAL_ADCEx_CalibrationStart() HAL_ADCEx_Calibration_GetValue()
Nume API comun Această funcție este utilizată pentru a porni calibrarea automată ADC
Această funcție este utilizată pentru a obține factorul de calibrare ADC
UM3029 – Rev 1
pagina 15/1419
3.7.2
UM3029
API-uri de extensie HAL
Carcase model de extensie HAL Caracteristicile periferice specifice pot fi gestionate de driverele HAL în cinci moduri diferite. Ele sunt descrise mai jos.
Adăugarea unei funcții specifice numărului de piesă Când este necesară o nouă caracteristică specifică unui dispozitiv dat, noile API-uri sunt adăugate în extensia stm32c0xx_hal_ppp_ex.c file. Ele sunt denumite HAL_PPPEx_Function().
Figura 2. Adăugarea de funcții specifice dispozitivului
Example: stm32c0xx_hal_pwr_ex.c/h #dacă este definit(PWR_SHDW_SUPPORT) void HAL_PWREx_EnterSHUTDOWNMode(void); #endif
Adăugarea unei funcții specifice familiei În acest caz, API-ul este adăugat în driverul de extensie C file și numit HAL_PPPEx_Function ().
Figura 3. Adăugarea funcțiilor specifice familiei
Adăugarea unui nou periferic (specific unui dispozitiv aparținând unei anumite familii)
Când este necesar un periferic care este disponibil doar într-un anumit dispozitiv, API-urile corespunzătoare acestui nou periferic/modul (newPPP) sunt adăugate într-un nou stm32c0xx_hal_newppp.c. Cu toate acestea, includerea acestui file este selectat în stm32c0xx_hal_conf.h folosind macrocomandă:
#define HAL_NEWPPP_MODULE_ENABLED
UM3029 – Rev 1
pagina 16/1419
Figura 4. Adăugarea de noi periferice
UM3029
API-uri de extensie HAL
Example: stm32c0xx_hal_adc.c/h
Actualizarea API-urilor comune existente În acest caz, rutinele sunt definite cu aceleași nume în extensia stm32c0xx_hal_ppp_ex.c file, în timp ce API-ul generic este definit ca slab, astfel încât compilatorul suprascrie rutina originală cu noua funcție definită.
Figura 5. Actualizarea API-urilor existente
Actualizarea structurilor de date existente
Structura de date pentru un anumit număr de parte a dispozitivului (de example PPP_InitTypeDef) poate avea câmpuri diferite. În acest caz, structura datelor este definită în antetul extensiei file și delimitate de declarația de definire a numărului de piese specific.
UM3029 – Rev 1
pagina 17/1419
UM3029
File model de incluziune
3.8
File model de incluziune
Antetul driverului HAL comun file (stm32c0xx_hal.h) include configurațiile comune pentru întreaga bibliotecă HAL. Este singurul antet file care este inclus în sursele utilizator și sursele HAL C files pentru a putea folosi resursele HAL.
Figura 6. File model de incluziune
Un driver PPP este un modul independent care este utilizat într-un proiect. Utilizatorul trebuie să activeze instrucțiunea de definire USE_HAL_PPP_MODULE corespunzătoare în configurație file.
/************************************************ ******************** * @file stm32c0xx_hal_conf.h * @author Echipa de aplicații MCD * @version VX.YZ * @data zz-mm-aaaa * @brief Aceasta file conține modulele de utilizat ******************************************** ************************** (…) #definiți HAL_USART_MODULE_ENABLED #definiți HAL_IRDA_MODULE_ENABLED #definiți HAL_DMA_MODULE_ENABLED #definiți HAL_RCC_MODULE_ENABLED (…)
UM3029 – Rev 1
pagina 18/1419
3.9 3.10
UM3029
HAL resurse comune
HAL resurse comune
Resursele comune HAL, cum ar fi enumerarea definită comună, structurile și macrocomenzile, sunt definite în stm32c0xx_hal_def.h. Principala enumerare definită comună este HAL_StatusTypeDef.
· Stare HAL Starea HAL este folosită de aproape toate API-urile HAL, cu excepția funcțiilor booleene și a handler-ului IRQ. Returnează starea operațiunilor API curente. Are patru valori posibile, după cum este descris mai jos:
Typedef enumerare { HAL_OK = 0x00, HAL_ERROR = 0x01, HAL_BUSY = 0x02, HAL_TIMEOUT = 0x03 } HAL_StatusTypeDef;
· HAL Locked Blocarea HAL este folosită de toate API-urile HAL pentru a preveni accesarea accidentală a resurselor partajate.
typedef enumerare { HAL_UNLOCKED = 0x00, /*!
Pe lângă resursele comune, fișierul stm32c0xx_hal_def.h file apelează stm32c0xx.h file în biblioteca CMSIS pentru a obține structurile de date și maparea adreselor pentru toate perifericele:
Declarații ale registrelor periferice și definirea biților. Macro-uri pentru a accesa registrele hardware periferice (cum ar fi Registrul de scriere sau registrul de citire). · Macrocomenzi comune Macro-comandă care definește HAL_MAX_DELAY
#define HAL_MAX_DELAY 0xFFFFFFFF
Macro care leagă un periferic PPP la un pointer de structură DMA:
#define __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD_, __DMA_HANDLE_) face{
(__HANDLE__)->__PPP_DMA_FIELD_ = &(__DMA_HANDLE_); (__DMA_HANDLE_).Parent = (__HANDLE__); } în timp ce(0)
Configurație HAL
Configurația file, stm32c0xx_hal_conf.h, permite personalizarea driverelor pentru aplicația utilizator. Modificarea acestei configurații nu este obligatorie: aplicația poate folosi configurația implicită fără nicio modificare.
Pentru a configura acești parametri, utilizatorul trebuie să activeze, să dezactiveze sau să modifice unele opțiuni prin decomentarea, comentarea sau modificarea valorilor instrucțiunilor define aferente, așa cum este descris în tabelul de mai jos:
Tabelul 11. Definiți instrucțiunile utilizate pentru configurația HAL
Element de configurare HSE_VALUE
HSE_STARTUP_TIMEOUT HSI_VALUE
HSI48_VALUE
LSI_VALUE
Descriere
Definește valoarea oscilatorului extern (HSE) exprimată în Hz. Utilizatorul trebuie să ajusteze această declarație define când folosește o valoare diferită a cristalului.
Timeout pentru pornirea HSE, exprimat în ms
Definește valoarea oscilatorului intern (HSI) exprimată în Hz.
Definește valoarea oscilatorului intern de mare viteză pentru USB exprimată în Hz. Valoarea reală poate varia în funcție de variațiile în voltage și temperatura.
Definește valoarea implicită a oscilatorului intern de viteză joasă (LSI) exprimată în Hz.
Valoare implicită 48 000 000 Hz
100 48 000 000 Hz 48 000 000 Hz
32000 Hz
UM3029 – Rev 1
pagina 19/1419
Nota:
3.11
3.11.1
3.11.2
UM3029
Manevrare periferică a sistemului HAL
Element de configurare
LSE_VALUE LSE_STARTUP_TIMEOUT
VDD_VALUE
Descriere
Definește valoarea oscilatorului extern (LSE) exprimată în Hz. Utilizatorul trebuie să ajusteze această declarație define când folosește o valoare diferită a cristalului.
Timeout pentru pornirea LSE, exprimat în ms
Valoarea VDD
USE_RTOS
Permite utilizarea RTOS
PREFETCH_ENABLE
Activează funcția de preluare anticipată
INSTRUCTION_CACHE_ENABLE Activează caracteristica ICACHE
Valoare implicită
32768 Hz
5000 3300 (mV) FALSE (pentru viitor
utilizare) FALS ADEVĂRAT
Modelul stm32c0xx_hal_conf_template.h file se află în folderul HAL drivers Inc. Ar trebui copiat în folderul utilizator, redenumit și modificat așa cum este descris mai sus. În mod implicit, valorile definite în stm32c0xx_hal_conf_template.h file sunt aceleași cu cele folosite pentru example şi demonstraţii. Toate HAL includ filesunt activate astfel încât să poată fi utilizate în codul utilizatorului fără modificări.
Manevrare periferică a sistemului HAL
Această secțiune oferă un pesteview despre modul în care perifericele sistemului sunt gestionate de driverele HAL. Lista completă API este furnizată în fiecare secțiune de descriere a driverului periferic.
Ceasurile Două funcții principale pot fi utilizate pentru a configura ceasul sistemului:
· HAL_RCC_OscConfig (RCC_OscInitTypeDef *RCC_OscInitStruct). Această funcție configurează/activează surse multiple de ceas (HSE, HSI, LSE, LSI).
· HAL_RCC_ClockConfig (RCC_ClkInitTypeDef *RCC_ClkInitStruct, uint32_t FLatency). Această funcție
selectează sursa ceasului sistemului configurează divizoarele de ceas AHB și APB1 configurează numărul de stări de așteptare ale memoriei Flash actualizează configurația SysTick când ceasul HCLK se modifică.
Unele ceasuri periferice nu sunt derivate din ceasul de sistem (cum ar fi RTC). În acest caz, configurarea ceasului este realizată de un API extins definit în stm32c0xx_hal_rcc_ex.c: HAL_RCCEx_PeriphCLKConfig(RCC_PeriphCLKInitTypeDef *PeriphClkInit). Sunt disponibile funcții suplimentare ale driverului RCC HAL:
· HAL_RCC_DeInit() Funcția de deinițializare a ceasului care returnează configurația ceasului pentru a reseta starea · Obțineți funcții de ceas care permit recuperarea diferitelor configurații de ceas (cum ar fi ceasul de sistem, HCLK sau
PCLK1) · Funcții de configurare MCO și CSS
Un set de macrocomenzi sunt definite în stm32c0xx_hal_rcc.h și stm32c0xx_hal_rcc_ex.h. Acestea permit executarea operațiunilor elementare pe registrele bloc RCC, cum ar fi controlul de pornire/resetare a ceasului perifericelor:
· __HAL_PPP_CLK_ENABLE/__HAL_PPP_CLK_DISABLE pentru a activa/dezactiva ceasul periferic · __HAL_PPP_FORCE_RESET/__HAL_PPP_RELEASE_RESET pentru a forța/elibera resetarea perifericei · __HAL_PPP_PPP__CLEP_CLEP__CLEP___CLIP SABLE pentru a activa/dezactiva perifericul
ceas în timpul modului Sleep. · __HAL_PPP_IS_CLK_ENABLED/__HAL_PPP_IS_CLK_DISABLED pentru a interoga despre activarea/dezactivarea
starea ceasului periferic. · __HAL_PPP_IS_CLK_SLEEP_ENABLED/__HAL_PPP_IS_CLK_SLEEP_DISABLED pentru a întreba despre
starea activată/dezactivată a ceasului periferic în timpul modului Sleep.
GPIO-urile GPIO HAL API-urile sunt următoarele:
UM3029 – Rev 1
pagina 20/1419
UM3029
Manevrare periferică a sistemului HAL
· HAL_GPIO_Init() / HAL_GPIO_DeInit() · HAL_GPIO_ReadPin() / HAL_GPIO_WritePin() · HAL_GPIO_TogglePin ().
În plus față de modurile GPIO standard (intrare, ieșire, analog), modul pin poate fi configurat ca EXTI cu întrerupere sau generare de evenimente. Când selectează modul EXTI cu generare de întrerupere, utilizatorul trebuie să apeleze HAL_GPIO_EXTI_IRQHandler() de la stm32c0xx_it.c și să implementeze HAL_GPIO_EXTI_Rising_Callback() și/sau HAL_GPIO_EXTI_Falling_Callback(). Tabelul de mai jos descrie câmpul de structură GPIO_InitTypeDef.
Tabelul 12. Descrierea structurii GPIO_InitTypeDef
Câmp de structură Pin
Modul
Viteza de tragere
Descriere
Specifică pinii GPIO care urmează să fie configurați. Valori posibile: GPIO_PIN_x sau GPIO_PIN_All, unde x[0..15] Specifică modul de operare pentru pinii selectați: modul GPIO sau modul EXTI. Valorile posibile sunt: · Modul GPIO
GPIO_MODE_INPUT : Intrare flotantă GPIO_MODE_OUTPUT_PP : Ieșire push-pull GPIO_MODE_OUTPUT_OD : Ieșire scurgere deschisă GPIO_MODE_AF_PP : Funcție alternativă push-pull GPIO_MODE_AF_OD : Funcție alternativă scurgere deschisă GPIO_MODE_OUTPUT_OD : Modul analogic GPIO_CONTROL_ANA_ANA_ : · CONTROL MOD analog_ANA al Mod de întrerupere GPIO_MODE_IT_RISING: Detectare declanșare margine ascendentă GPIO_MODE_IT_FALLING: Cădere detectarea declanșării marginii GPIO_MODE_IT_RISING_FALLING : Detectare a declanșării marginii în creștere/descădere · Mod eveniment extern GPIO_MODE_EVT_RISING : Detectare a declanșării marginii în creștere GPIO_MODE_EVT_FALLING : Detectare a declanșării marginii în scădere GPIO_MODE_EVT_RISING_FALLING de declanșare:
Specifică activarea Pull-up sau Pull-down pentru pinii selectați. Valorile posibile sunt: GPIO_NOPULL GPIO_PULLUP GPIO_PULLDOWN
Specifică viteza pentru pinii selectați. Valorile posibile sunt: GPIO_SPEED_FREQ_LOW GPIO_SPEED_FREQ_MEDIUM GPIO_SPEED_FREQ_HIGH GPIO_SPEED_FREQ_VERY_HIGH
Vă rugăm să găsiți mai jos configurația tipică GPIO de examples:
· Configurarea GPIO-urilor ca ieșire push-pull pentru a conduce LED-uri externe:
GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
UM3029 – Rev 1
pagina 21/1419
3.11.3 3.11.4 3.11.5
UM3029
Manevrare periferică a sistemului HAL
· Configurarea PA0 ca întrerupere externă cu sensibilitate la front descendent:
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure);
Cortex® NVIC și cronometru SysTick Driverul Cortex® HAL, stm32c0xx_hal_cortex.c, oferă API-uri pentru a gestiona NVIC și SysTick. API-urile acceptate includ: · HAL_NVIC_SetPriority()/ HAL_NVIC_SetPriorityGrouping() · HAL_NVIC_GetPriority() / HAL_NVIC_GetPriorityGrouping() · HAL_NVIC_EnableIRQ()/HAL_NVIC_SetPriorityGrouping() · HAL_NVIC_GetPriority() · HAL_NVIC_GetPriorityGrouping() STICK_IRQHandler() · HAL_NVIC_GetPendingIRQ() / HAL_NVIC_SetPendingIRQ () / HAL_NVIC_ClearPendingIRQ() · HAL_NVIC_GetActive(IRQn) · HAL_SYSTICK_Config() · HAL_SYSTICK_CLKSourceConfig() · HAL_SYSTICK_Callback()
PWR Driverul PWR HAL se ocupă de gestionarea energiei. Caracteristicile partajate între toate seria STM32 sunt enumerate mai jos: · Configurarea pinului de trezire
HAL_PWR_EnableWakeUpPin() / HAL_PWR_DisableWakeUpPin() · Intrare în modul de consum redus
HAL_PWR_EnterSLEEPMode() HAL_PWR_EnterSTANDBYMode() · Funcții de gestionare a consumului redus de energie STM32C0: HAL_PWREx_EnterSHUTDOWNMode()
EXTI EXTI nu este considerat un periferic de sine stătător, ci mai degrabă ca un serviciu utilizat de alte periferice, care sunt gestionate prin intermediul API-urilor EXTI HAL. În plus, fiecare driver HAL periferic implementează configurația EXTI asociată și funcționează ca macrocomenzi în antetul său file. Primele 16 linii EXTI conectate la GPIO-uri, sunt gestionate în cadrul driverului GPIO. Structura GPIO_InitTypeDef permite configurarea unui I/O ca întrerupere externă sau eveniment extern. Liniile EXTI conectate intern la RTC, I2C1 și USART1 sunt configurate în driverele HAL ale acestor periferice prin macrocomenzile prezentate în tabelul de mai jos. Conexiunile interne EXTI depind de microcontrolerul STM32 vizat (consultați fișa tehnică a produsului pentru mai multe detalii):
Tabelul 13. Descrierea macrocomenzilor de configurare EXTI
Macrocomenzi __HAL_PPP_{SUBLOCK}__EXTI_ENABLE_IT()
__HAL_PPP_{SUBLOCK}__EXTI_DISABLE_IT() __HAL_ PPP_{SUBLOCK}__EXTI_GET_FLAG()
Descriere Activează o anumită întrerupere a liniei EXTI Example: __HAL_PWR_PVD_EXTI_ENABLE_IT() Dezactivează o linie EXTI dată. Example: __HAL_PWR_PVD_EXTI_DISABLE_IT() Obține un semnal de întrerupere a liniei EXTI în așteptarea stării biților.
UM3029 – Rev 1
pagina 22/1419
3.11.6
UM3029
Manevrare periferică a sistemului HAL
Macro-uri
__HAL_ PPP_{SUBLOCK}_EXTI_CLEAR_FLAG()
__HAL_ PPP_{SUBLOCK}_EXTI_GENERATE_SWIT()
__HAL_PPP_SUBBLOCK_EXTI_ENABLE_EVENT()
__HAL_PPP_SUBBLOCK_EXTI_DISABLE_EVENT() __HAL_ PPP_SUBBLOCK_EXTI_ENABLE_RISING_EDGE() __HAL_ PPP_SUBBLOCK_EXTI_ENABLE_FALLING_EDGE() __HAL_ PPP_SUBBLOCK_SUBBLOCK_EXTI_ENABLE_RISING_EDGE() __HAL_ PPP_SUBBLOCK_EXTI_ENABLE_FALLING_EDGE() __HAL_ PPP_SUBBLOCK_SUBBLOCK_EXTI__DIGESABLE_EXTI__DI_EDGE_BLOCK_PPP EXTI_DISABLE_FALLING_EDGE() __HAL_ PPP_SUBBLOCK_EXTI_ENABLE_RISING_FALLING_EDGE() __HAL_ PPP_SUBBLOCK_EXTI_DISABLE_RISING_FALLING_EDGE()
Examppe:
Descriere
__HAL_PWR_PVD_EXTI_GET_FLAG()
Șterge un indicator de întrerupere a liniei EXTI dat. Example; __HAL_PWR_PVD_EXTI_CLEAR_FLAG()
Generează o întrerupere software pentru o anumită linie EXTI. Exampfișier: __HAL_PWR_PVD_EXTI_ GENERATE_SWIT ()
Activați un anumit eveniment de linie EXTI Exampfișier: __HAL_RTC_WAKEUP_EXTI_ENABLE_EVENT()
Dezactivați un anumit eveniment de linie EXTI Exampfișier: __HAL_RTC_WAKEUP_EXTI_DISABLE_EVENT()
Configurați o întrerupere EXTI sau un eveniment pe marginea ascendentă
Activați o întrerupere EXTI sau un eveniment pe marginea de cădere
Dezactivați o întrerupere EXTI sau un eveniment pe marginea ascendentă
Dezactivați o întrerupere EXTI sau un eveniment pe marginea de cădere
Activați o întrerupere EXTI sau un eveniment pe marginea de creștere/descădere
Dezactivați o întrerupere EXTI sau un eveniment pe marginea în creștere/descădere
Dacă este selectat modul de întrerupere EXTI, aplicația utilizator trebuie să apeleze HAL_PPP_FUNCTION_IRQHandler() (de ex.ampfișierul HAL_PWR_PVD_IRQHandler()), de la stm32c0xx_it.c fileși implementați funcția de apel invers HAL_PPP_FUNCTIONCallback() (de exampfișierul HAL_PWR_PVDCallback().
DMA Driverul DMA HAL permite activarea și configurarea perifericului pentru a fi conectat la canalele DMA (cu excepția memoriei interne SRAM/FLASH care nu necesită nicio inițializare). Consultați manualul de referință al produsului pentru detalii despre cererea DMA corespunzătoare fiecărui periferic. Pentru un canal dat, API-ul HAL_DMA_Init() permite programarea configurației necesare prin următorii parametri: · Direcția de transfer · Formate de date sursă și destinație · Circular, Mod de control normal · Nivel de prioritate canal · Mod de creștere sursă și destinație · Cerere hardware conectată la periferic
Sunt disponibile două moduri de operare: · Funcționare I/O în modul polling
1. Utilizați HAL_DMA_Start() pentru a porni transferul DMA atunci când adresele sursă și destinație și Lungimea datelor de transferat au fost configurate.
2. Utilizați HAL_DMA_PollForTransfer() pentru a interoga sfârșitul transferului curent. În acest caz, un timeout fix poate fi configurat în funcție de aplicația utilizatorului.
UM3029 – Rev 1
pagina 23/1419
Notă: Notă:
3.12
3.12.1
UM3029
Cum se utilizează driverele HAL
· Funcționare I/O în modul întrerupere 1. Configurați prioritatea întreruperii DMA utilizând HAL_NVIC_SetPriority(). 2. Activați handlerul DMA IRQ utilizând HAL_NVIC_EnableIRQ(). 3. Utilizați HAL_DMA_Start_IT() pentru a porni transferul DMA atunci când adresele sursă și destinație și lungimea datelor de transferat au fost configurate. În acest caz, întreruperea DMA este configurată. 4. Folosiți HAL_DMA_IRQHandler() apelat în subrutina de întrerupere DMA_IRQHandler(). 5. Când transferul de date este complet, funcția HAL_DMA_IRQHandler() este executată și o funcție de utilizator poate fi apelată prin personalizarea pointerului funcției XferCpltCallback și XferErrorCallback (care este un membru al structurii de mâner DMA).
Sunt disponibile funcții și macrocomenzi suplimentare pentru a asigura o gestionare eficientă a DMA: · Utilizați funcția HAL_DMA_GetState() pentru a returna starea DMA și HAL_DMA_GetError() în caz de eroare
detectare. · Utilizați funcția HAL_DMA_Abort() pentru a anula transferul curent. Cele mai utilizate macrocomenzi pentru driverul DMA HAL sunt următoarele: · __HAL_DMA_ENABLE: activează canalul DMA specificat · __HAL_DMA_DISABLE: dezactivează canalul DMA specificat · __HAL_DMA_GET_FLAG: primește semnalizatoarele în așteptare ale canalului DMA · __HAL_DMA_CLEAR_FLAG_DMA_EN Șterge semnalizarea canalului DMA_FLAG__IT: permite întreruperile canalului DMA specificate · __HAL_DMA_DISABLE_IT: dezactivează întreruperile canalului DMA specificate · __HAL_DMA_GET_IT_SOURCE: verifică dacă întreruperea canalului DMA specificat a fost activată sau
nu Când un periferic este utilizat în modul DMA, inițializarea DMA trebuie făcută în apelarea HAL_PPP_MspInit(). În plus, aplicația utilizator trebuie să asocieze mânerul DMA cu mânerul PPP (consultați secțiunea „Funcții de operare HAL IO”). Reapelurile canalului DMA trebuie inițializate de aplicația utilizator numai în cazul transferului de la memorie la memorie. Cu toate acestea, atunci când sunt utilizate transferuri de la periferică la memorie, aceste apeluri inverse sunt inițializate automat prin apelarea unei funcții API de proces care utilizează DMA.
Cum se utilizează driverele HAL
Modele de utilizare HAL Figura următoare arată utilizarea tipică a driverului HAL și interacțiunea dintre utilizatorul aplicației, driverul HAL și întreruperi.
UM3029 – Rev 1
pagina 24/1419
stm32c0xxx_it.c
DMAx_IRQHandler sau
PPP_IRQHandler
UM3029
Cum se utilizează driverele HAL
Figura 7. Modelul driverului HAL
hal_msp.c app.c/main.c
1. Declarați mânerul PPP 2. Parametrii mânerului inițial 3. Apelați HAL_PPP_init()
HAL_PPP_Mspinit()
stm32c0xxx_hal_ppp.c
Servicii
stm32c0xx_hal_gpio.c/h
HAL_PPP_Init()
stm32c0xx_hal_rcc.c/h stm32c0xx_hal_nvic.c/h
Apelați HAL_PPP_Process()
HAL_PPP_Process()
stm32c0xx_hal_dma.c/h
Model de întrerupere
Model DMA
Hal_PPP_ProcessCpltCallBack() Hal_PPP_ErrorCallBack()
Apelați HAL_PPP_DeInit() HAL_PPP_MspDeinit()
HAL_PPP_DeInit()
Nota:
3.12.2 3.12.2.1
Funcțiile implementate în driverul HAL sunt afișate cu verde, funcțiile apelate de la manipulatorii de întreruperi în linii punctate, iar funcțiile msp implementate în aplicația utilizator în roșu. Liniile fără puncte reprezintă interacțiunile dintre funcțiile aplicației utilizator. Practic, API-urile driverului HAL sunt apelate de la utilizator files și opțional de la manipulatorii de întreruperi file când sunt utilizate API-urile bazate pe DMA sau întreruperile dedicate periferice PPP. Când sunt utilizate întreruperi periferice DMA sau PPP, apelurile complete ale procesului PPP sunt apelate pentru a informa utilizatorul despre finalizarea procesului în modul eveniment în timp real (întreruperi). Rețineți că aceleași apeluri de finalizare a procesului sunt utilizate pentru DMA în modul de întrerupere.
Inițializare HAL
Inițializarea globală HAL În plus față de funcțiile de inițializare și dezinițializare periferică, sunt furnizate un set de API-uri pentru a inițializa nucleul HAL implementat în file stm32c0xx_hal.c. · HAL_Init(): această funcție trebuie apelată la pornirea aplicației
inițializați memoria cache a datelor/instrucțiunilor și setați cronometrul SysTick în coada de preluare pentru a genera o întrerupere la fiecare 1ms (pe baza ceasului HSI) cu funcția de apel invers HAL_MspInit() cu cea mai scăzută prioritate pentru a efectua inițializări la nivel de sistem (Clock, GPIO, DMA,
întrerupe). HAL_MspInit() este definită ca o funcție goală „slabă” în driverele HAL. · HAL_DeInit()
Resetează toate perifericele apelează funcția HAL_MspDeInit() care este o funcție de apel invers de utilizator pentru a face de-inițializari la nivel de sistem.
UM3029 – Rev 1
pagina 25/1419
UM3029
Cum se utilizează driverele HAL
3.12.2.2 3.12.2.3
· HAL_GetTick(): această funcție primește valoarea curentă a contorului SysTick (incrementată în întrerupere SysTick) utilizată de driverele periferice pentru a gestiona timeout-urile.
· HAL_Delay(). această funcție implementează o întârziere (exprimată în milisecunde) utilizând cronometrul SysTick.
Trebuie avut grijă când utilizați HAL_Delay(), deoarece această funcție oferă o întârziere precisă (exprimată în milisecunde) bazată pe o variabilă incrementată în SysTick ISR. Aceasta înseamnă că dacă HAL_Delay() este apelat de la un ISR periferic, atunci întreruperea SysTick trebuie să aibă cea mai mare prioritate (numeric mai mică) decât întreruperea periferică, altfel ISR apelant este blocat.
Inițializarea ceasului de sistem Configurarea ceasului se face la începutul codului utilizatorului. Cu toate acestea, utilizatorul poate schimba configurația ceasului în propriul său cod.
Sub secvența tipică de configurare a ceasului pentru a atinge frecvența maximă de ceas de 48 MHz pe baza ceasului HSE.
/** * @brief Configurare ceas de sistem * @retval Nici unul */
void SystemClock_Config(void) {
RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
/** Inițializează oscilatorii RCC conform parametrilor specificați * în structura RCC_OscInitTypeDef. */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; dacă (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
Error_Handler(); } /** Inițializează ceasurile magistralelor CPU, AHB și APB */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
dacă (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
Error_Handler(); } }
Procesul de inițializare HAL MSP Inițializarea perifericului se face prin HAL_PPP_Init(), în timp ce inițializarea resurselor hardware utilizate de un periferic (PPP) este efectuată în timpul acestei inițializare prin apelarea funcției de apel invers MSP HAL_PPP_MspInit().
Callback-ul MspInit realizează inițializarea de nivel scăzut legată de diferitele resurse hardware suplimentare: RCC, GPIO, NVIC și DMA.
Toate driverele HAL cu mânere includ două apeluri MSP pentru inițializare și dezinițializare:
UM3029 – Rev 1
pagina 26/1419
UM3029
Cum se utilizează driverele HAL
3.12.3 3.12.3.1
/** * @brief Inițializează MSP-ul PPP. * @param hppp: PPP handle * @retval None */ void __weak HAL_PPP_MspInit(PPP_HandleTypeDef *hppp) { /* NOTĂ: Această funcție nu ar trebui modificată, când este nevoie de apel invers, HAL_PPP_MspInit ar putea fi implementat în utilizator file */ } /** * @brief Deinițializează PPP MSP. * @param hppp: PPP handle * @retval None */ void __weak HAL_PPP_MspDeInit(PPP_HandleTypeDef *hppp) { /* NOTĂ: Această funcție nu ar trebui modificată, când este nevoie de apel invers, HAL_PPP_MspDeInit poate fi implementat în utilizator file */ }
Apelurile MSP sunt declarate goale ca funcții slabe în fiecare driver periferic. Utilizatorul le poate folosi pentru a seta codul de inițializare de nivel scăzut sau le poate omite și să folosească propria sa rutină de inițializare. Callback-ul HAL MSP este implementat în interiorul stm32c0xx_hal_msp.c file în folderele utilizatorilor. Un stm32c0xx_hal_msp.c file șablonul se află în folderul HAL și trebuie copiat în folderul utilizatorului. Poate fi generat automat de instrumentul STM32CubeMX și modificat în continuare. Rețineți că toate rutinele sunt declarate ca funcții slabe și ar putea fi suprascrise sau eliminate pentru a utiliza codul de inițializare de nivel scăzut al utilizatorului. stm32c0xx_hal_msp.c file contine urmatoarele functii:
Rutină void HAL_MspInit() void HAL_MspDeInit() void HAL_PPP_MspInit() void HAL_PPP_MspDeInit()
Tabel 14. Funcții MSP Descriere
Rutina de inițializare globală MSP Rutină globală de de-inițializare MSP
Rutina de inițializare PPP MSP Rutina de dezinițializare PPP MSP
În mod implicit, dacă niciun periferic nu trebuie să fie de-inițializat în timpul execuției programului, întreaga inițializare MSP se face în Hal_MspInit() și MSP De-Initialization în Hal_MspDeInit(). În acest caz, HAL_PPP_MspInit() și HAL_PPP_MspDeInit() nu sunt implementate. Când unul sau mai multe periferice trebuie să fie de-inițializate în timpul de rulare și resursele de nivel scăzut ale unui anumit periferic trebuie să fie eliberate și utilizate de un alt periferic, HAL_PPP_MspDeInit() și HAL_PPP_MspInit() sunt implementate pentru inițializarea perifericului respectiv și a altor periferice. și de-inițializarea sunt păstrate în HAL_MspInit() global și HAL_MspDeInit(). Dacă nu există nimic care să fie inițializat de HAL_MspInit() și HAL_MspDeInit(), cele două rutine pot fi pur și simplu omise.
Procesul de operare HAL I/O Funcțiile HAL cu procesare internă a datelor, cum ar fi transmiterea, primirea, scrierea și citirea, sunt în general prevăzute cu trei moduri de procesare a datelor, după cum urmează: · Modul de interogare · Modul de întrerupere · Modul DMA
Modul Polling În modul Polling, funcțiile HAL returnează starea procesului când procesarea datelor în modul de blocare este completă. Operația este considerată completă atunci când funcția returnează starea HAL_OK, altfel este returnată o stare de eroare. Utilizatorul poate obține mai multe informații prin intermediul funcției HAL_PPP_GetState(). Prelucrarea datelor este gestionată intern într-o buclă. Un timeout (exprimat în ms) este utilizat pentru a preveni blocarea procesului. Fostulampfișierul de mai jos arată secvența tipică de procesare a modului de sondare:
UM3029 – Rev 1
pagina 27/1419
UM3029
Cum se utilizează driverele HAL
3.12.3.2
HAL_StatusTypeDef HAL_PPP_Transmit ( PPP_HandleTypeDef * phandle, uint8_t pData, int16_tSize,uint32_tTimeout) { if((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } (…) while (procesarea datelor este în curs de desfășurare) { if( timeout atins ) { return HAL_TIMEOUT; } } (…) returnează HAL_OK; }
Modul de întrerupere
În modul de întrerupere, funcția HAL returnează starea procesului după ce a început procesarea datelor și a activat întreruperea corespunzătoare. Sfârșitul operațiunii este indicat de un callback declarat ca o funcție slabă. Acesta poate fi personalizat de către utilizator pentru a fi informat în timp real despre finalizarea procesului. De asemenea, utilizatorul poate obține starea procesului prin funcția HAL_PPP_GetState().
În modul de întrerupere, în driver sunt declarate patru funcții: · HAL_PPP_Process_IT(): lansează procesul · HAL_PPP_IRQHandler(): întrerupere globală a perifericei PPP · __weak HAL_PPP_ProcessCpltCallback (): callback relativ la finalizarea procesului. · __weak HAL_PPP_ProcessErrorCallback(): apel invers în raport cu eroarea procesului. Pentru a utiliza un proces în modul de întrerupere, HAL_PPP_Process_IT() este apelat în utilizator file și HAL_PPP_IRQHandler în stm32c0xx_it.c. Funcția HAL_PPP_ProcessCpltCallback() este declarată ca funcție slabă în driver. Aceasta înseamnă că utilizatorul îl poate declara din nou în aplicație. Funcția din driver nu este modificată.
Un exampUtilizarea este ilustrată mai jos: main.c file:
UART_HandleTypeDef UartHandle; int main(void) { /* Setați parametrii utilizatorului */ UartHandle.Init.BaudRate = 9600; UartHandle.Init.WordLength = UART_DATABITS_8; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.Instance = USART1; HAL_UART_Init(&UartHandle); HAL_UART_SendIT(&UartHandle, TxBuffer, sizeof(TxBuffer)); în timp ce (1); } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { }
UM3029 – Rev 1
pagina 28/1419
3.12.3.3
UM3029
Cum se utilizează driverele HAL
stm32c0xx_it.cfile:
extern UART_HandleTypeDef UartHandle; void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&UartHandle); }
Modul DMA În modul DMA, funcția HAL returnează starea procesului după începerea procesării datelor prin DMA și după activarea întreruperii DMA corespunzătoare. Sfârșitul operațiunii este indicat de un callback declarat ca o funcție slabă și poate fi personalizat de către utilizator pentru a fi informat în timp real despre finalizarea procesului. De asemenea, utilizatorul poate obține starea procesului prin funcția HAL_PPP_GetState(). Pentru modul DMA, trei funcții sunt declarate în driver: · HAL_PPP_Process_DMA(): lansează procesul · HAL_PPP_DMA_IRQHandler(): întreruperea DMA utilizată de perifericul PPP · __weak HAL_PPP_ProcessCpltCallback(): callback relativ la finalizarea procesului. · __weak HAL_PPP_ErrorCpltCallback(): callback-ul relativ la procesul Error. Pentru a utiliza un proces în modul DMA, HAL_PPP_Process_DMA() este apelat în utilizator file iar HAL_PPP_DMA_IRQHandler() este plasat în stm32c0xx_it.c. Când se utilizează modul DMA, inițializarea DMA se face în apel invers HAL_PPP_MspInit(). De asemenea, utilizatorul ar trebui să asocieze mânerul DMA cu mânerul PPP. În acest scop, mânerele tuturor driverelor periferice care utilizează DMA trebuie declarate după cum urmează:
typedef struct { PPP_TypeDef *Instanță; /* Înregistrează adresa de bază */ PPP_InitTypeDef Init; /* Parametrii de comunicare PPP */ HAL_StateTypeDef State; /* Starea comunicării PPP */ (…) DMA_HandleTypeDef *hdma; /* handle DMA asociat */ } PPP_HandleTypeDef;
Inițializarea se face după cum urmează (UART example):
int main(void) { /* Setați parametrii utilizatorului */ UartHandle.Init.BaudRate = 9600; UartHandle.Init.WordLength = UART_DATABITS_8; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.Instance = UART1; HAL_UART_Init(&UartHandle); (..) } void HAL_USART_MspInit (UART_HandleTypeDef * huart) { static DMA_HandleTypeDef hdma_tx; static DMA_HandleTypeDef hdma_rx; (…) __HAL_LINKDMA(UartHandle, DMA_Handle_tx, hdma_tx); __HAL_LINKDMA(UartHandle, DMA_Handle_rx, hdma_rx); (...)
Funcția HAL_PPP_ProcessCpltCallback() este declarată ca funcție slabă în driver, ceea ce înseamnă că utilizatorul o poate declara din nou în codul aplicației. Funcția din șofer nu trebuie modificată. Un exampCodul de utilizare este ilustrat mai jos:
UM3029 – Rev 1
pagina 29/1419
3.12.4 3.12.4.1
UM3029
Cum se utilizează driverele HAL
principal.c file:
UART_HandleTypeDef UartHandle; int main(void) { /* Setați parametrii utilizatorului */ UartHandle.Init.BaudRate = 9600; UartHandle.Init.WordLength = UART_DATABITS_8; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.Instance = USART1; HAL_UART_Init(&UartHandle); HAL_UART_Send_DMA(&UartHandle, TxBuffer, sizeof(TxBuffer)); în timp ce (1); } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *phuart) { } void HAL_UART_TxErrorCallback(UART_HandleTypeDef *phuart) { }
stm32c0xx_it.c file:
extern UART_HandleTypeDef UartHandle; void DMAx_IRQHandler(void) { HAL_DMA_IRQHandler(&UartHandle.DMA_Handle_tx); }
HAL_USART_TxCpltCallback() și HAL_USART_ErrorCallback() ar trebui să fie conectate în funcția HAL_PPP_Process_DMA() la apelarea completă a transferului DMA și la apelarea eroare de transfer DMA utilizând următoarea instrucțiune:
HAL_PPP_Process_DMA (PPP_HandleTypeDef *hppp, Params....) { (…) hppp->DMA_Handle->XferCpltCallback = HAL_UART_TxCpltCallback ; hppp->DMA_Handle->XferErrorCallback = HAL_UART_ErrorCallback ; (...)
Timeout și gestionarea erorilor
Management timeout Timeout este adesea folosit pentru API-urile care operează în modul Polling. Acesta definește întârzierea în care un proces de blocare ar trebui să aștepte până când este returnată o eroare. Un exampfișierul este furnizat mai jos: HAL_StatusTypeDef HAL_DMA_PollForTransfer(DMA_HandleTypeDef *hdma, uint32_t CompleteLevel, uint32_t Timeout)
Valorile posibile ale timeout-ului sunt următoarele:
Tabelul 15. Valori timeout
Valoarea timeout
Descriere
0
Fără sondaj: verificare și ieșire imediată a procesului
1 … (HAL_MAX_DELAY -1) (1)
Timeout în ms
HAL_MAX_DELAY
Sondajul infinit până când procesul este reușit
1. HAL_MAX_DELAY este definit în stm32c0xx_hal_def.h ca 0xFFFFFFFF
Cu toate acestea, în unele cazuri, un timeout fix este utilizat pentru perifericele sistemului sau procesele interne ale driverului HAL. În aceste cazuri, timeout-ul are aceeași semnificație și este utilizat în același mod, cu excepția cazului în care este definit local în drivere și nu poate fi modificat sau introdus ca argument în aplicația utilizator.
UM3029 – Rev 1
pagina 30/1419
UM3029
Cum se utilizează driverele HAL
3.12.4.2
Exampfișierul de timeout fix:
#define LOCAL_PROCESS_TIMEOUT 100 HAL_StatusTypeDef HAL_PPP_Process(PPP_HandleTypeDef) { (…) timeout = HAL_GetTick() + LOCAL_PROCESS_TIMEOUT; (…) while(ProcessOngoing) { (…) if(HAL_GetTick() timeout) { /* Proces deblocat */ __HAL_UNLOCK(hppp); hppp->State= HAL_PPP_STATE_TIMEOUT; returnează HAL_PPP_STATE_TIMEOUT; } } (…) }
Următorul exampfișierul arată cum se utilizează timeout-ul în cadrul funcțiilor de sondare:
HAL_PPP_StateTypeDef HAL_PPP_Poll (PPP_HandleTypeDef *hppp, uint32_t Timeout) { (…) timeout = HAL_GetTick() + Timeout; (…) while(ProcessOngoing) { (…) if(Timeout != HAL_MAX_DELAY) { if(HAL_GetTick() timeout) { /* Proces deblocat */ __HAL_UNLOCK(hppp); hppp->State= HAL_PPP_STATE_TIMEOUT; return hppp->State; } } (…) }
Gestionarea erorilor
Șoferii HAL implementează o verificare a următoarelor elemente:
· Parametri validi: pentru unele procese parametrii utilizați ar trebui să fie validi și deja definiți, altfel sistemul se poate bloca sau intra într-o stare nedefinită. Acești parametri critici sunt verificați înainte de a fi utilizați (vezi example de mai jos).
HAL_StatusTypeDef HAL_PPP_Process(PPP_HandleTypeDef* hppp, uint32_t *pdata, uint32 Size) { if ((pData == NULL ) || (Size == 0)) { return HAL_ERROR; } }
UM3029 – Rev 1
pagina 31/1419
UM3029
Cum se utilizează driverele HAL
3.12.4.3
· Mâner valid: mânerul periferic PPP este cel mai important argument, deoarece păstrează parametrii vitali ai driverului PPP. Este întotdeauna verificat la începutul funcției HAL_PPP_Init().
HAL_StatusTypeDef HAL_PPP_Init(PPP_HandleTypeDef* hppp) { if (hppp == NULL) //handlingul ar trebui să fie deja alocat { return HAL_ERROR; } }
· Eroare de timeout: se folosește următoarea instrucțiune când apare o eroare de timeout:
while (Proces în curs) { timeout = HAL_GetTick() + Timeout; while (procesarea datelor este în curs de desfășurare) { if(timeout) { return HAL_TIMEOUT; } }
Când apare o eroare în timpul unui proces periferic, HAL_PPP_Process () revine cu o stare HAL_ERROR. Driverul HAL PPP implementează HAL_PPP_GetError () pentru a permite regăsirea originii erorii.
HAL_PPP_ErrorTypeDef HAL_PPP_GetError (PPP_HandleTypeDef *hppp);
În toate mânerele periferice, un HAL_PPP_ErrorTypeDef este definit și utilizat pentru a stoca ultimul cod de eroare.
typedef struct { PPP_TypeDef * Instanță; /* PPP înregistrează adresa de bază */ PPP_InitTypeDef Init; /* Parametrii de inițializare PPP */ HAL_LockTypeDef Lock; /* Obiect de blocare PPP */ __IO HAL_PPP_StateTypeDef State; /* Stare PPP */ __IO HAL_PPP_ErrorTypeDef ErrorCode; /* Cod de eroare PPP */ (…) /* Parametri specifici PPP */ } PPP_HandleTypeDef;
Starea de eroare și starea globală periferică sunt întotdeauna actualizate înainte de a returna o eroare: PPP->State = HAL_PPP_READY; /* Setați perifericul gata */ PP->ErrorCode = HAL_ERRORCODE ; /* Setați codul de eroare */ _HAL_UNLOCK(PPP) ; /* Deblochează resursele PPP */ returnează HAL_ERROR; /*revine cu eroare HAL */
HAL_PPP_GetError () trebuie utilizat în modul de întrerupere în apelarea de eroare:
void HAL_PPP_ProcessCpltCallback(PPP_HandleTypeDef *hspi) { ErrorCode = HAL_PPP_GetError (hppp); /* regăsește codul de eroare */ }
Verificarea timpului de rulare HAL implementează detectarea erorilor de rulare prin verificarea valorilor de intrare ale tuturor funcțiilor driverului HAL. Verificarea timpului de rulare este realizată prin utilizarea unei macrocomenzi assert_param. Această macrocomandă este utilizată în toate funcțiile driverului HAL care au un parametru de intrare. Permite verificarea faptului că valoarea de intrare se încadrează în valorile permise ale parametrului. Pentru a activa verificarea timpului de execuție, utilizați macrocomanda assert_param și lăsați definirea USE_FULL_ASSERT necomentată în stm32c0xx_hal_conf.h file.
UM3029 – Rev 1
pagina 32/1419
UM3029
Cum se utilizează driverele HAL
void HAL_UART_Init(UART_HandleTypeDef *huart) { (..) /* Verificați parametrii */ assert_param(IS_UART_INSTANCE(huart->Instance)); assert_param(IS_UART_BAUDRATE(huart->Init.BaudRate)); assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); assert_param(IS_UART_STOPBITS(huart->Init.StopBits)); assert_param(IS_UART_PARITY(huart->Init.Parity)); assert_param(IS_UART_MODE(huart->Init.Mode)); assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); (..)
Atenţie:
/** @defgroup UART_Word_Length * @{ */ #define UART_WORDLENGTH_8B ((uint32_t)0x00000000) #define UART_WORDLENGTH_9B ((uint32_t)USART_CR1_M) #define IS_UART_WORDLENGTH_) =(UART_WORDLENGTH_) _8B) || ((LUNGIME) == UART_WORDLENGTH_9B))
Dacă expresia transmisă macrocomenzii assert_param este falsă, funcția assert_failed este apelată și returnează numele sursei file și numărul liniei sursă a apelului care a eșuat. Dacă expresia este adevărată, nu se returnează nicio valoare. Macro-ul assert_param este implementat în stm32c0xx_hal_conf.h:
/* Macrocomandă exportată ————————————————————*/ #ifdef USE_FULL_ASSERT /** * @brief Macrocomanda assert_param este utilizată pentru verificarea parametrilor funcției. * @param expr: Dacă expr este fals, apelează funcția assert_failed * care raportează numele sursei file și sursa * numărul liniei apelului care a eșuat. * Dacă expr este adevărat, nu returnează nicio valoare. * @retval Nici unul */ #define assert_param(expr) ((expr)?(void)0:assert_failed((uint8_t *)__FILE__, __LINE__)) /* Funcții exportate ————————————–*/ void assert_failed(uint8_t* file, linia uint32_t); #else #define assert_param(expr)((void)0) #endif /* USE_FULL_ASSERT */
Funcția assert_failed este implementată în main.c file sau în orice alt utilizator C file:
#ifdef USE_FULL_ASSERT /** * @brief Raportează numele sursei file și numărul liniei sursă * unde a apărut eroarea assert_param. * @param file: indicator către sursă file nume * @param line: assert_param error line line number * @retval Nici unul */ void assert_failed(uint8_t* file, uint32_t line) { /* Utilizatorul își poate adăuga propria implementare pentru a raporta file numele și numărul rândului, ex: printf(„Valoare greșită a parametrilor: file %s pe linia %drn”, file, linie) */ /* Buclă infinită */ while (1) { } }
Datorită verificării overhead-time introduse, este recomandat să îl utilizați în timpul dezvoltării codului aplicației și al depanării și să îl eliminați din aplicația finală pentru a îmbunătăți dimensiunea și viteza codului.
UM3029 – Rev 1
pagina 33/1419
4
4.1
Nota:
UM3029
Pesteview a driverelor de nivel inferior
Pesteview a driverelor de nivel inferior
Driverele cu strat inferior (LL) sunt proiectate pentru a oferi un strat rapid, ușor, orientat spre experți, care este mai aproape de hardware decât HAL. Spre deosebire de HAL, API-urile LL nu sunt furnizate pentru periferice pentru care accesul optimizat nu este o caracteristică cheie sau pentru cele care necesită o configurație de software grea și/sau o stivă complexă de nivel superior (cum ar fi USB). Caracteristicile driverelor LL:
· Un set de funcții pentru a inițializa caracteristicile principale ale perifericelor în funcție de parametrii specificați în structurile de date
· Un set de funcții utilizate pentru a completa structurile de date de inițializare cu valorile resetate ale fiecărui câmp · Funcții pentru a efectua dezinițializarea periferică (registrele periferice restaurate la valorile implicite) · Un set de funcții inline pentru acces direct și la registrul atomic · Independență deplină de la HAL, deoarece driverele LL pot fi utilizate fie în modul de sine stătător (fără drivere HAL)
sau în modul mixt (cu drivere HAL) · Acoperire completă a caracteristicilor periferice acceptate
Driverele de nivel inferior oferă servicii hardware bazate pe caracteristicile disponibile ale perifericelor STM32. Aceste servicii reflectă exact capacitățile hardware și oferă operațiuni one-shot care trebuie apelate urmând modelul de programare descris în manualul de referință al liniei de microcontroler. Drept urmare, serviciile LL nu implementează nicio prelucrare și nu necesită resurse de memorie suplimentare pentru a-și salva stările, contorul sau pointerii de date: toate operațiunile sunt efectuate prin modificarea conținutului registrelor periferice asociate.
Strat inferior files
Driverele de nivel inferior sunt construite în jurul header/C files (unul pentru fiecare periferic acceptat) plus cinci antet files pentru unele caracteristici legate de System și Cortex.
Tabelul 16. Driver LL files
File
Descriere
stm32c0xx_ll_bus.h
Aceasta este sursa h file pentru controlul magistralei de bază și activarea și dezactivarea ceasului periferic Exampfișier: LL_AHB1_GRP1_EnableClock
stm32c0xx_ll_ppp.h/.c
stm32c0xx_ll_ppp.c oferă funcții de inițializare periferică, cum ar fi LL_PPP_Init(), LL_PPP_StructInit(), LL_PPP_DeInit(). Toate celelalte API-uri sunt definite în stm32c0xx_ll_ppp.h file.
Driverul PPP de nivel inferior este un modul independent. Pentru a o utiliza, aplicația trebuie să o includă în stm32c0xx_ll_ppp.h file.
stm32c0xx_ll_cortex.h
API-uri de operare a registrului legate de Cortex-M, inclusiv Systick, Putere scăzută (cum ar fi LL_SYSTICK_xxxxx și LL_LPM_xxxxx „Modul de putere redusă”)
stm32c0xx_ll_utils.h/.c
Acest file acoperă API-urile generice: · Citirea ID-ului unic al dispozitivului și semnătura electronică · Gestionarea bazei de timp și a întârzierilor · Configurarea ceasului sistemului.
Operațiuni legate de sistem. stm32c0xx_ll_system.h
Exampfișier: LL_SYSCFG_xxx, LL_DBGMCU_xxx și LL_FLASH_xxx
Șablon file permițând definirea macrocomenzii assert_param, care este utilizată atunci când este activată verificarea în timpul execuției. stm32_assert_template.h Aceasta file este necesar numai atunci când driverele LL sunt utilizate în modul de sine stătător (fără a apela API-urile HAL). Ar trebui copiat în folderul aplicației și redenumit în stm32_assert.h.
Nu există nicio configurație file pentru driverele LL. Stratul inferior filesunt localizate în același folder de driver HAL.
UM3029 – Rev 1
pagina 34/1419
Figura 8. Foldere de drivere de nivel inferior
UM3029
Strat inferior files
În general, driverele de nivel inferior includ doar dispozitivul STM32 CMSIS file. #include „stm32yyxx.h”
UM3029 – Rev 1
pagina 35/1419
UM3029
Pesteview a API-urilor de nivel inferior și a regulilor de denumire
Figura 9. Driver de nivel inferior CMSIS files
4.2
4.2.1
Aplicație filetrebuie să includă doar antetul driverului de nivel inferior utilizat files.
Pesteview a API-urilor de nivel inferior și a regulilor de denumire
Funcții de inițializare periferice Driverele LL oferă trei seturi de funcții de inițializare. Ele sunt definite în stm32c0xx_ll_ppp.c file: · Funcții de inițializare a caracteristicilor principale ale perifericelor în funcție de parametrii specificați în structurile de date · Un set de funcții utilizate pentru a completa structurile de date de inițializare cu valorile resetate ale fiecărui câmp · Funcție pentru dezinițializare periferică (registrele periferice restaurate la valorile implicite) Definiția acestor funcții de inițializare LL și resurse asociate (structură, literale și prototipuri) este condiționată de un comutator de compilare: USE_FULL_LL_DRIVER. Pentru a utiliza aceste funcții, acest comutator trebuie adăugat în preprocesorul compilatorului lanțului de instrumente sau la orice antet generic file care este procesat înaintea driverelor LL. Tabelul de mai jos prezintă lista funcțiilor comune furnizate pentru toate perifericele acceptate:
UM3029 – Rev 1
pagina 36/1419
UM3029
Pesteview a API-urilor de nivel inferior și a regulilor de denumire
Tabelul 17. Funcții comune de inițializare periferică
Funcțiile LL_PPP_Init
Tip de returnare
· Stare eroare ·
LL_PPP_StructInit
gol
·
LL_PPP_DeInit ErrorStatus ·
Parametrii
Descriere
PPP_TypeDef* PPPx LL_PPP_InitTypeDef* PPP_InitStruct LL_PPP_InitTypeDef* PPP_InitStruct
PPP_TypeDef* PPPx
Inițializează caracteristicile principale ale perifericelor în funcție de parametrii specificați în PPP_InitStruct.
Exampfișier: LL_USART_Init(USART_TypeDef *USARTx, LL_USART_InitTypeDef *USART_InitStruct)
Completează fiecare membru PPP_InitStruct cu valoarea sa implicită.
Example. LL_USART_StructInit(LL_USART_InitTypeDef *USART_InitStruct)
De-inițializează registrele periferice, adică le restaurează la valorile lor implicite de resetare.
Example. LL_USART_DeInit(USART_TypeDef *USARTx)
Sunt disponibile funcții suplimentare pentru unele periferice (consultați Tabelul 18. Funcții opționale de inițializare a perifericelor).
Tabelul 18. Funcții opționale de inițializare periferică
Funcții
Tip de returnare
Parametrii
Examples
Inițializează caracteristicile periferice în funcție de parametrii specificați în PPP_InitStruct.
LL_PPP{_CATEGORY}_Init
· Stare eroare ·
Examppe:
LL_ADC_INJ_Init(ADC_TypeDef *ADCx, LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
PPP_TypeDef* PPPx LL_PPP{_CATEGORY}_InitTypeDef* PPP{_CATEGORY}_InitStruct
LL_RTC_TIME_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_TimeTypeDef *RTC_TimeStruct)
LL_RTC_DATE_Init(RTC_TypeDef *RTCx, uint32_t RTC_Format, LL_RTC_DateTypeDef *RTC_DateStruct)
LL_TIM_IC_Init(TIM_TypeDef* TIMx, uint32_t Channel, LL_TIM_IC_InitTypeDef* TIM_IC_InitStruct)
LL_PPP{_CATEGORY}_StructInit
gol
LL_PPP{_CATEGORY}_InitTypeDef* PPP{_CATEGORY}_InitStruct
LL_PPP_CommonInit
· Stare eroare ·
PPP_TypeDef* PPPx LL_PPP_CommonInitTypeDef* PPP_CommonInitStruct
LL_PPP_CommonStructInit
gol
LL_PPP_CommonInitTypeDef* PPP_CommonInitStruct
LL_PPP_ClockInit
· Stare eroare ·
PPP_TypeDef* PPPx LL_PPP_ClockInitTypeDef* PPP_ClockInitStruct
LL_TIM_ENCODER_Init(TIM_TypeDef* TIMx, LL_TIM_ENCODER_InitTypeDef* TIM_EncoderInitStruct)
Completează fiecare membru PPP{_CATEGORY}_InitStruct cu valoarea sa implicită.
Exampfișier: LL_ADC_INJ_StructInit(LL_ADC_INJ_InitTypeDef *ADC_INJ_InitStruct)
Inițializează caracteristicile comune împărtășite între diferite instanțe ale aceluiași periferic.
Exampfișier: LL_ADC_CommonInit(ADC_Common_TypeDef *ADCxy_COMMON, LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
Completează fiecare membru PPP_CommonInitStruct cu valoarea sa implicită
Exampfișier: LL_ADC_CommonStructInit(LL_ADC_CommonInitTypeDef *ADC_CommonInitStruct)
Inițializează configurația ceasului periferic în modul sincron.
UM3029 – Rev 1
pagina 37/1419
UM3029
Pesteview a API-urilor de nivel inferior și a regulilor de denumire
Funcții
Tip de returnare
LL_PPP_ClockStructInit
gol
Parametri LL_PPP_ClockInitTypeDef*
PPP_ClockInitStruct
Examples
Exampfișier: LL_USART_ClockInit(USART_TypeDef *USARTx, LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
Completează fiecare membru PPP_ClockInitStruct cu valoarea sa implicită
Exampfișier: LL_USART_ClockStructInit(LL_USART_ClockInitTypeDef *USART_ClockInitStruct)
4.2.1.1
Notă: 4.2.2
Verificarea timpului de execuție La fel ca driverele HAL, funcțiile de inițializare LL implementează detectarea eșecului în timpul execuției prin verificarea valorilor de intrare ale tuturor funcțiilor driverului LL. Pentru mai multe detalii, consultați Secțiunea 3.12.4.3 Verificarea timpului de rulare. Când utilizați driverele LL în modul de sine stătător (fără a apela funcțiile HAL), sunt necesare următoarele acțiuni pentru a utiliza verificarea în timpul rulării: 1. Copiați stm32_assert_template.h în folderul aplicației și redenumiți-l în stm32_assert.h. Acest file defineste
macrocomanda assert_param care este utilizată atunci când este activată verificarea în timpul executării. 2. Includeți stm32_assert.h file în antetul principal al aplicației file. 3. Adăugați comutatorul de compilare USE_FULL_ASSERT în preprocesorul compilatorului lanțului de instrumente sau în orice generic
antet file care este procesat înaintea driverului stm32_assert.h. Verificarea timpului de execuție nu este disponibilă pentru funcțiile inline LL.
Funcții de configurare la nivel de registru periferic Pe lângă funcțiile de inițializare periferică, driverele LL oferă un set de funcții inline pentru acces direct la registrul atomic. Formatul lor este următorul:
__STATIC_INLINE return_type LL_PPP_Function (PPPx_TypeDef *PPPx, args)
Denumirea „Funcției” este definită în funcție de categoria de acțiune: · Gestionarea de întreruperi specifice, cereri DMA și steagurile de stare: Setare/Obține/Ștergere/Activare/Dezactivare steaguri pe
registre de întrerupere și stare
Tabelul 19. Gestionarea întreruperilor specifice, a cererii DMA și a indicatoarelor de stare
Nume
LL_PPP_{_CATEGORY}_ActionItem_BITNAME LL_PPP{_CATEGORY}_IsItem_BITNAME_Action
Examples
· LL_RCC_IsActiveFlag_LSIRDY · LL_RCC_IsActiveFlag_FWRST() · LL_ADC_ClearFlag_EOC(ADC1) · LL_DMA_ClearFlag_TCx(DMA_TypeDef* DMAx)
Nota:
Semnalul articolului întreruperi
DMA
Acțiunea Obțineți clar
Permite dezactivarea
Obțineți Activare Dezactivare
Obţine
Tabelul 20. Formate de funcții disponibile
Formatați LL_PPP_IsActiveFlag_BITNAME
LL_PPP_ClearFlag_BITNAME LL_PPP_EnableIT_BITNAME LL_PPP_DisableIT_BITNAME LL_PPP_IsEnabledIT_BITNAME LL_PPP_EnableDMAReq_BITNAME LL_PPP_DisableDMAReq_BITNAME LL_PPP_IsEnabled_PPP_NAME
BITNAME se referă la numele de bit al registrului periferic, așa cum este descris în manualul de referință al liniei de produse.
UM3029 – Rev 1
pagina 38/1419
Notă: Notă:
UM3029
Pesteview a API-urilor de nivel inferior și a regulilor de denumire
· Gestionarea activării/dezactivarii ceasului periferic: Activați/Dezactivați/Resetați un ceas periferic
Tabelul 21. Gestionarea activării/dezactivarii ceasului periferic
Nume LL_BUS_GRPx_ActionClock{Mode} ·
·
Examples
LL_AHB1_GRP1_EnableClock (LL_AHB1_GRP1_PERIPH_DMA1) LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_RTC)
„x” corespunde indexului de grup și se referă la indexul registrului modificat pe o magistrală dată. „autobuz” corespunde numelui autobuzului.
· Gestionarea activării/dezactivarii perifericelor: activați/dezactivați un periferic sau activați/dezactivați anumite funcții periferice
Tabel 22. Gestionarea activării/dezactivarii perifericelor
Nume
· LL_PPP{_CATEGORY}_Action{Item} · LL_PPP{_CATEGORY}_IsItemAction ·
· ·
Examples
LL_ADC_Enable () LL_ADC_StartCalibration(); LL_ADC_IsCalibrationOnGoing; LL_RCC_HSI_Enable () LL_RCC_HSI_IsReady()
· Gestionarea configurației periferice: Setați/obțineți setări de configurare periferice
Tabelul 23. Managementul configurației periferice
Nume LL_PPP{_CATEGORY}_Set{ sau
Obțineți}ConfigItem
Exampfișierele LL_USART_SetBaudRate (USART2, Ceas, LL_USART_BAUDRATE_9600)
· Managementul registrului periferic: Scrieți/citiți conținutul unui registru/retrun adresa de registru DMA
Tabelul 24. Managementul registrului periferic
Nume LL_PPP_WriteReg(__INSTANCE__, __REG__, __VALUE__)
LL_PPP_ReadReg(__INSTANCE__, __REG__) LL_PPP_DMA_GetRegAddr (PPP_TypeDef *PPPx,{Instanță secundară dacă există, de exemplu: Canal} , {uint32_t Proprietate})
Proprietatea este o variabilă utilizată pentru a identifica direcția de transfer DMA sau tipul de registru de date.
UM3029 – Rev 1
pagina 39/1419
5
5.1
Nota:
5.2
Nota:
UM3029
Conviețuirea dintre HAL și LL
Conviețuirea dintre HAL și LL
API-urile low-ayer sunt concepute pentru a fi utilizate în mod independent sau combinate cu HAL. Ele nu pot fi utilizate automat cu HAL pentru aceeași instanță periferică. Dacă utilizați API-urile LL pentru o anumită instanță, puteți utiliza în continuare API-urile HAL pentru alte instanțe. Aveți grijă ca API-urile de nivel inferior să suprascrie unele registre a căror conținut este oglindit în mânerele HAL.
Driver de nivel inferior utilizat în modul Standalone
API-urile de nivel inferior pot fi utilizate fără a apela serviciile de driver HAL. Acest lucru se face prin simpla includere a stm32c0xx_ll_ppp.h în aplicație files. API-urile LL pentru un anumit periferic sunt apelate prin executarea aceleiași secvențe ca și cea recomandată de modelul de programare în manualul de referință al liniei de produse corespunzătoare. În acest caz, driverele HAL asociate perifericului utilizat pot fi îndepărtate din spațiul de lucru. Cu toate acestea, cadrul STM32CubeC0 ar trebui utilizat în același mod ca în cazul driverelor HAL, ceea ce înseamnă că sistemul file, lansare file și CMSIS ar trebui să fie întotdeauna utilizat. Când driverele BSP sunt incluse, driverele HAL utilizate asociate cu driverele de funcții BSP ar trebui să fie incluse în spațiul de lucru, chiar dacă nu sunt utilizate de stratul de aplicație.
Utilizarea mixtă a API-urilor de nivel inferior și a driverelor HAL
În acest caz, API-urile de nivel inferior sunt utilizate împreună cu driverele HAL pentru a realiza operațiuni directe și la nivel de înregistrare. Utilizarea mixtă este permisă, totuși ar trebui luate în considerare unele considerații: · Se recomandă evitarea utilizării simultane a API-urilor HAL și a combinației de API-uri de nivel inferior pentru
o instanță periferică dată. Dacă acesta este cazul, unul sau mai multe câmpuri private din structura HAL PPP handle ar trebui actualizate în consecință. · Pentru operațiuni și procese care nu modifică câmpurile de ghidare, inclusiv structura de inițializare, API-urile driverului HAL și serviciile de nivel inferior pot fi utilizate împreună pentru aceeași instanță periferică. · Driverele de nivel inferior pot fi utilizate fără nicio restricție cu toate driverele HAL care nu se bazează pe obiecte handle (RCC, HAL comun, Flash și GPIO). Mai mulți exampfișierele care arată cum să utilizați HAL și LL în aceeași aplicație sunt furnizate în pachetul de firmware stm32c0 (consultați Ex.ampproiecte les_MIX). 1. Când API-urile HAL Init/DeInit nu sunt utilizate și sunt înlocuite cu macrocomenzi de nivel inferior, funcțiile InitMsp() nu sunt apelate și inițializarea MSP trebuie făcută în aplicația utilizator. 2. Când API-urile de proces nu sunt utilizate și funcția corespunzătoare este efectuată prin intermediul API-urilor de nivel inferior, apelurile inverse nu sunt apelate și postprocesarea sau gestionarea erorilor ar trebui să fie efectuată de aplicația utilizator. 3. Când API-urile LL sunt utilizate pentru operațiuni de proces, API-urile HAL de gestionare a IRQ nu pot fi apelate și IRQ-ul ar trebui implementat de aplicația utilizator. Fiecare driver LL implementează macrocomenzile necesare pentru a citi și șterge steaguri de întrerupere asociate.
UM3029 – Rev 1
pagina 40/1419
6
Driver de sistem HAL
UM3029
Driver de sistem HAL
6.1
6.1.1 6.1.2
6.1.3
Descrierea API a driverului firmware-ului HAL
Următoarea secțiune listează diferitele funcții ale bibliotecii HAL.
Cum se utilizează acest driver
Driverul HAL comun conține un set de API-uri generice și comune care pot fi utilizate de driverele periferice PPP și de utilizator pentru a începe să folosească HAL. HAL conține două categorii de API: · API-uri HAL comune · API-uri HAL pentru servicii
Funcții de inițializare și configurare HAL
Această secțiune oferă funcții care permit: · Inițializarea interfeței Flash, alocarea NVIC și configurația inițială a ceasului bazei de timp. · De-inițializați partea comună a HAL. · Configurați sursa bazei de timp pentru a avea o bază de timp de 1 ms cu o prioritate de întrerupere Tick dedicată.
Cronometrul SysTick este folosit implicit ca sursă de bază de timp, dar utilizatorul poate implementa în cele din urmă sursa de bază de timp adecvată (un temporizator de uz general de example sau altă sursă de timp), ținând cont de faptul că durata bazei de timp trebuie păstrată 1 ms, deoarece PPP_TIMEOUT_VALUE sunt definite și gestionate în milisecunde.
Funcția de configurare a bazei de timp (HAL_InitTick ()) este apelată automat la începutul programului după resetare de către HAL_Init() sau în orice moment când ceasul este configurat, de către HAL_RCC_ClockConfig().
Sursa bazei de timp este configurată pentru a genera întreruperi la intervale de timp regulate. Trebuie avut grijă dacă HAL_Delay() este apelat dintr-un proces ISR periferic, linia de întrerupere Tick trebuie să aibă prioritate mai mare (mai mică numeric) decât întreruperea periferică. În caz contrar, procesul ISR apelantului va fi blocat.
funcțiile care afectează configurațiile bazei de timp sunt declarate ca __slabe pentru a face posibilă înlocuirea în cazul altor implementări în utilizator file.
Această secțiune conține următoarele API-uri: · HAL_Init() · HAL_DeInit() · HAL_MspInit() · HAL_MspDeInit() · HAL_InitTick()
Funcții de control HAL
Această secțiune oferă funcții care permit: · Furnizați o valoare de bifă în milisecunde · Furnizați o întârziere de blocare în milisecunde · Suspendați întreruperea sursei bazei de timp · Reluarea întreruperii sursei bazei de timp · Obțineți versiunea driverului API HAL · Obțineți identificatorul dispozitivului · Obțineți identificatorul de revizuire a dispozitivului Această secțiune conține următoarele API-uri: · HAL_IncTick() · HAL_GetTick() · HAL_GetTickPrio() · HAL_SetTickFreq()
UM3029 – Rev 1
pagina 41/1419
UM3029
Descrierea API a driverului firmware-ului HAL
· HAL_GetTickFreq() · HAL_Delay() · HAL_SuspendTick() · HAL_ResumeTick() · HAL_GetHalVersion() · HAL_GetREVID() · HAL_GetDEVID() · HAL_GetUIDw0() · HAL_GetUIDw1()() · HAL_GetUIDw2()()
6.1.4
HAL Funcții de depanare
Această secțiune oferă funcții care permit: · Activarea/Dezactivarea modulului de depanare în timpul modului STOP · Activarea/Dezactivarea modulului de depanare în timpul modului STANDBY Această secțiune conține următoarele API-uri: · HAL_DBGMCU_EnableDBGStopMode() · HAL_DBGMCU_DisableDBGStopMode() · HAL_DBGMCU_EnableDBGStandby_Mode_DBGMCU)
6.1.5
Funcții de configurare HAL SYSCFG
Această secțiune oferă funcții care permit: · Activarea/Dezactivarea remapării pinului · Activarea/Dezactivarea comutatorului analog I/O vol.tage booster Această secțiune conține următoarele API-uri: · HAL_SYSCFG_EnableIOAnalogSwitchBooster() · HAL_SYSCFG_DisableIOAnalogSwitchBooster() · HAL_SYSCFG_EnableRemap() · HAL_SYSCFG_DisableRemap() · HAL_SYSCFG_DisableRemap() · HAL_SYSCFG_inding() HALSetPSC_inding() HALSetPSC_GPSC_in Legare()
6.1.6
Descrierea detaliată a funcțiilor
HAL_Init
Numele funcției HAL_StatusTypeDef HAL_Init (void )
Descrierea funcției
Configurați preluare Flash și cache-ul de instrucțiuni, sursa de bază de timp, NVIC și orice hardware global de nivel scăzut necesar apelând funcția de apel invers HAL_MspInit() pentru a fi definită opțional în utilizator. file stm32c0xx_hal_msp.c.
Valori returnate ·
HAL: stare
UM3029 – Rev 1
pagina 42/1419
UM3029
Descrierea API a driverului firmware-ului HAL
Note
· Funcția HAL_Init() este apelată la începutul programului după resetare și înainte de configurarea ceasului.
· În implementarea implicită, System Timer (Systick) este folosit ca sursă de bază de timp. Configurația Systick se bazează pe ceasul HSI, deoarece HSI este ceasul utilizat după o resetare a sistemului. Odată terminat, tick-ul bazei de timp începe să crească: contorul variabilei tick este incrementat la fiecare 1 ms în gestionarea de întreruperi SysTick_Handler().
HAL_DeInit
Numele funcției HAL_StatusTypeDef HAL_DeInit (void )
Descrierea funcției Această funcție de-inițializează o parte comună a HAL și oprește sursa bazei de timp.
Valori returnate ·
HAL: stare
Note
· Această funcție este opțională.
HAL_MspInit
Nume funcție void HAL_MspInit (void )
Descrierea funcției Inițializați MSP.
Valori returnate ·
Nici unul:
HAL_MspDeInit
Numele funcției void HAL_MspDeInit (void )
Descrierea funcției Deinițializează MSP-ul.
Valori returnate ·
Nici unul:
HAL_InitTick
Numele funcției HAL_StatusTypeDef HAL_InitTick (uint32_t TickPriority)
Descrierea funcției
Această funcție configurează sursa bazei de timp: Sursa de timp este configurată să aibă o bază de timp de 1 ms cu o prioritate de întrerupere Tick dedicată.
Parametri ·
TickPriority: Bifați prioritatea întreruperii.
Valori returnate ·
HAL: stare
UM3029 – Rev 1
pagina 43/1419
UM3029
Descrierea API a driverului firmware-ului HAL
Note
· Această funcție este apelată automat la începutul programului după resetarea de către HAL_Init() sau în orice moment când ceasul este reconfigurat de HAL_RCC_ClockConfig().
· În implementarea implicită, cronometrul SysTick este sursa bazei de timp. Este folosit pentru a genera întreruperi la intervale regulate de timp. Trebuie avut grijă dacă HAL_Delay() este apelat dintr-un proces ISR periferic, întreruperea SysTick trebuie să aibă prioritate mai mare (mai mică numeric) decât întreruperea periferică. În caz contrar, procesul ISR apelantului va fi blocat. Funcția este declarată ca __weak pentru a fi suprascrisă în cazul unei alte implementări în utilizator file.
HAL_IncTick
Nume funcție void HAL_IncTick (void )
Descrierea funcției Această funcție este apelată pentru a incrementa o variabilă globală „uwTick” utilizată ca bază de timp pentru aplicație.
Valori returnate ·
Nici unul:
Note
· În implementarea implicită, această variabilă este incrementată la fiecare 1 ms în SysTick ISR. · Această funcție este declarată ca __weak pentru a fi suprascrisă în cazul altor implementări în utilizator file.
HAL_Întârziere
Numele funcției void HAL_Delay (uint32_t Delay)
Descrierea funcției Această funcție oferă o întârziere minimă (în milisecunde) pe baza variabilei incrementate.
Parametri ·
Întârziere: specifică durata de întârziere, în milisecunde.
Valori returnate ·
Nici unul:
Note
· În implementarea implicită, cronometrul SysTick este sursa bazei de timp. Este folosit pentru a genera întreruperi la intervale regulate de timp în care uwTick este incrementat.
· Această funcție este declarată ca __weak pentru a fi suprascrisă în cazul altor implementări în utilizator file.
HAL_GetTick
Numele funcției uint32_t HAL_GetTick (void )
Descrierea funcției Oferă o valoare de bifă în milisecunde.
Valori returnate ·
bifa: valoare
Note
· Această funcție este declarată ca __weak pentru a fi suprascrisă în cazul altor implementări în utilizator file.
UM3029 – Rev 1
pagina 44/1419
UM3029
Descrierea API a driverului firmware-ului HAL
HAL_GetTickPrio
Numele funcției uint32_t HAL_GetTickPrio (void )
Descrierea funcției Această funcție returnează o prioritate de bifare.
Valori returnate ·
bif: prioritate
HAL_SetTickFreq
Numele funcției HAL_StatusTypeDef HAL_SetTickFreq (uint32_t Freq)
Descrierea funcției Setați o nouă bifă Frec.
Valori returnate ·
stare:
HAL_GetTickFreq
Numele funcției uint32_t HAL_GetTickFreq (void )
Descrierea funcției frecvența de bifare a revenirii.
Valori returnate ·
bifa: perioada in Hz
HAL_SuspendTick
Numele funcției void HAL_SuspendTick (void )
Descrierea funcției Suspend Tick increment.
Valori returnate ·
Nici unul:
Note
· În implementarea implicită, cronometrul SysTick este sursa bazei de timp. Este folosit pentru a genera întreruperi la intervale regulate de timp. Odată ce HAL_SuspendTick() este apelat, întreruperea SysTick va fi dezactivată și astfel creșterea Tick este suspendată.
· Această funcție este declarată ca __weak pentru a fi suprascrisă în cazul altor implementări în utilizator file.
HAL_ResumeTick Numele funcției
void HAL_ResumeTick (void ) Descrierea funcției
Reluați creșterea Tick.
UM3029 – Rev 1
pagina 45/1419
UM3029
Descrierea API a driverului firmware-ului HAL
Valori returnate ·
Note ·
·
Nici unul:
În implementarea implicită, cronometrul SysTick este sursa bazei de timp. Este folosit pentru a genera întreruperi la intervale regulate de timp. Odată ce HAL_ResumeTick() este apelat, întreruperea SysTick va fi activată și astfel creșterea Tick este reluată. Această funcție este declarată ca __slabă pentru a fi suprascrisă în cazul altor implementări în utilizator file.
HAL_GetHalVersion
Numele funcției uint32_t HAL_GetHalVersion (void )
Descrierea funcției Returnează versiunea HAL.
Valori returnate ·
versiune: : 0xXYZR (8 biți pentru fiecare zecimală, R pentru RC)
HAL_GetREVID
Numele funcției uint32_t HAL_GetREVID (void )
Descrierea funcției Returnează identificatorul de revizuire a dispozitivului.
Valori returnate ·
Dispozitiv: identificator de revizuire
HAL_GetDEVID
Numele funcției uint32_t HAL_GetDEVID (void )
Descrierea funcției Returnează identificatorul dispozitivului.
Valori returnate ·
Dispozitiv: identificator
HAL_GetUIDw0
Numele funcției uint32_t HAL_GetUIDw0 (void )
Descrierea funcției Returnează primul cuvânt al identificatorului unic al dispozitivului (UID bazat pe 96 de biți)
Valori returnate ·
Dispozitiv: identificator
HAL_GetUIDw1 Numele funcției
uint32_t HAL_GetUIDw1 (void)
UM3029 – Rev 1
pagina 46/1419
UM3029
Descrierea API a driverului firmware-ului HAL
Descrierea funcției Returnează al doilea cuvânt al identificatorului unic de dispozitiv (UID bazat pe 96 de biți)
Valori returnate ·
Dispozitiv: identificator
HAL_GetUIDw2
Numele funcției uint32_t HAL_GetUIDw2 (void )
Descrierea funcției Returnează al treilea cuvânt din identificatorul unic al dispozitivului (UID bazat pe 96 de biți)
Valori returnate ·
Dispozitiv: identificator
HAL_DBGMCU_EnableDBGStopMode
Nume funcție void HAL_DBGMCU_EnableDBGStopMode (void )
Descrierea funcției Activați modulul de depanare în timpul modului STOP.
Valori returnate ·
Nici unul:
HAL_DBGMCU_DisableDBGStopMode
Numele funcției void HAL_DBGMCU_DisableDBGStopMode (void )
Descrierea funcției Dezactivați modulul de depanare în timpul modului STOP.
Valori returnate ·
Nici unul:
HAL_DBGMCU_EnableDBGStandbyMode
Numele funcției void HAL_DBGMCU_EnableDBGStandbyMode (void )
Descrierea funcției Activați modulul de depanare în modul STANDBY.
Valori returnate ·
Nici unul:
HAL_DBGMCU_DisableDBGStandbyMode Numele funcției
void HAL_DBGMCU_DisableDBGStandbyMode (void ) Descrierea funcției
Dezactivați modulul de depanare în modul STANDBY.
UM3029 – Rev 1
pagina 47/1419
UM3029
Descrierea API a driverului firmware-ului HAL
Valori returnate ·
Nici unul:
HAL_SYSCFG_EnableIOAnalogSwitchBooster
Nume funcție void HAL_SYSCFG_EnableIOAnalogSwitchBooster (void )
Descrierea funcției Activați comutatorul analogic I/O voltage booster.
Valori returnate ·
Nici unul:
HAL_SYSCFG_DisableIOAnalogSwitchBooster
Numele funcției void HAL_SYSCFG_DisableIOAnalogSwitchBooster (void )
Descrierea funcției Dezactivează comutatorul analogic I/O voltage booster.
Valori returnate ·
Nici unul:
HAL_SYSCFG_EnableRemap
Numele funcției void HAL_SYSCFG_EnableRemap (uint32_t PinRemap)
Descrierea funcției Activați remaparea pe PA11_PA12.
Parametri ·
PinRemap: specifică ce pini trebuie remapați. Acest parametru poate fi orice combinație a următoarelor valori:
SYSCFG_REMAP_PA11
SYSCFG_REMAP_PA12
Valori returnate ·
Nici unul:
HAL_SYSCFG_DisableRemap
Numele funcției void HAL_SYSCFG_DisableRemap (uint32_t PinRemap)
Descrierea funcției Dezactivați remaparea pe PA11_PA12.
Parametri ·
PinRemap: specifică ce pini se vor comporta normal. Acest parametru poate fi orice combinație a următoarelor valori:
SYSCFG_REMAP_PA11
SYSCFG_REMAP_PA12
UM3029 – Rev 1
pagina 48/1419
UM3029
Driverul de firmware HAL definește
Valori returnate ·
Nici unul:
HAL_SYSCFG_SetPinBinding
Numele funcției void HAL_SYSCFG_SetPinBinding (uint32_t pin_binding)
Descrierea funcției Set Pin Binding.
Parametri ·
pin_binding: specifică ce pin va lega un anumit GPIO pentru fiecare pachet de matriță Acest parametru poate fi orice combinație de HAL_BIND_xx definește
Valori returnate ·
Nici unul:
HAL_SYSCFG_GetPinBinding
Numele funcției uint32_t HAL_SYSCFG_GetPinBinding (void )
Descrierea funcției return Pin Binding configurație
Valori returnate ·
PinMux: configurare
6.2
Driverul de firmware HAL definește
Următoarea secțiune listează diferitele definiții și macrocomenzi ale modulului.
6.2.1
HAL HAL Bind Pin config
HAL_BIND_WLCSP14_PINF2_PA1 STM32C031 Pachetul WLCSP14, PinF2 atribuit GPIO PA1
HAL_BIND_WLCSP14_PINF2_PA2 STM32C031 Pachetul WLCSP14, PinF2 atribuit GPIO PA2
HAL_BIND_WLCSP14_PING3_PF2 STM32C031 Pachetul WLCSP14, PinG3 atribuit GPIO PF2
HAL_BIND_WLCSP14_PING3_PA0 STM32C031 Pachetul WLCSP14, PinG3 atribuit GPIO PA0
HAL_BIND_WLCSP14_PINJ1_PA8 STM32C031 Pachetul WLCSP14, PinJ1 atribuit GPIO PA8
HAL_BIND_WLCSP14_PINJ1_PA11 STM32C031 Pachetul WLCSP14, PinJ1 atribuit GPIO PA11
HAL_BIND_WLCSP14_PINH2_PA5 STM32C031 Pachetul WLCSP14, PinH2 atribuit GPIO PA5
UM3029 – Rev 1
pagina 49/1419
HAL_BIND_WLCSP14_PINH2_PA6 STM32C031 Pachetul WLCSP14, PinH2 atribuit GPIO PA6
HAL_BIND_WLCSP14_PING1_PA7 STM32C031 Pachetul WLCSP14, PinG1 atribuit GPIO PA7
HAL_BIND_WLCSP14_PING1_PA12 STM32C031 Pachetul WLCSP14, PinG1 atribuit GPIO PA12
HAL_BIND_WLCSP14_PINJ3_PA3 STM32C031 Pachetul WLCSP14, PinJ3 atribuit GPIO PA3
HAL_BIND_WLCSP14_PINJ3_PA4 STM32C031 Pachetul WLCSP14, PinJ3 atribuit GPIO PA4
Selectarea semnalului anvelopei de modulație IR HAL_SYSCFG_IRDA_ENV_SEL_TIM16
00: Timer16 este selectat ca sursă de anvelopă de modulație IR HAL_SYSCFG_IRDA_ENV_SEL_USART1
01: USART1 este selectat ca sursă de anvelopă de modulație IR HAL_SYSCFG_IRDA_ENV_SEL_USART2
10: USART2 este selectat ca sursă de anvelopă de modulare IR
Selectarea polarității ieșirii IR HAL_SYSCFG_IRDA_POLARITY_NOT_INVERTED
00: Polaritatea ieșirii IR nu este inversată HAL_SYSCFG_IRDA_POLARITY_INVERTED
01: Polaritatea ieșirii IR inversată
HAL ISR Wrapper HAL_SYSCFG_ITLINE0
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE2
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE3
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE4
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE5
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE6
Definiție internă pentru manipularea macro HAL_SYSCFG_ITLINE7
Definiție internă pentru manipularea macro
UM3029 – Rev 1
UM3029
Driverul de firmware HAL definește
pagina 50/1419
HAL_SYSCFG_ITLINE9 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE10 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE11 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE12 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE13 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE14 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE16 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE19 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE21 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE22 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE23 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE25 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE27 Definiție internă pentru manipularea macrocomenzilor
HAL_SYSCFG_ITLINE28 Definiție internă pentru manipularea macrocomenzilor
HAL_ITLINE_WWDG WWDG întrerupere
HAL_ITLINE_RTC RTC întrerupere
HAL_ITLINE_FLASH_ITF Flash ITF întrerupere
HAL_ITLINE_CLK_CTRL Întreruperea controlului CLK
HAL_ITLINE_EXTI0 întrerupere externă 0
UM3029 – Rev 1
UM3029
Driverul de firmware HAL definește
pagina 51/1419
HAL_ITLINE_EXTI1 întrerupere externă 1
HAL_ITLINE_EXTI2 întrerupere externă 2
HAL_ITLINE_EXTI3 întrerupere externă 3
HAL_ITLINE_EXTI4 EXTI4 întrerupere
HAL_ITLINE_EXTI5 EXTI5 întrerupere
HAL_ITLINE_EXTI6 EXTI6 întrerupere
HAL_ITLINE_EXTI7 EXTI7 întrerupere
HAL_ITLINE_EXTI8 EXTI8 întrerupere
HAL_ITLINE_EXTI9 EXTI9 întrerupere
HAL_ITLINE_EXTI10 EXTI10 întrerupere
HAL_ITLINE_EXTI11 EXTI11 întrerupere
HAL_ITLINE_EXTI12 EXTI12 întrerupere
HAL_ITLINE_EXTI13 EXTI13 întrerupere
HAL_ITLINE_EXTI14 EXTI14 întrerupere
HAL_ITLINE_EXTI15 EXTI15 întrerupere
HAL_ITLINE_DMA1_CH1 DMA1 Întreruperea canalului 1
HAL_ITLINE_DMA1_CH2 DMA1 Întreruperea canalului 2
HAL_ITLINE_DMA1_CH3 DMA1 Întreruperea canalului 3
HAL_ITLINE_DMAMUX DMAMUX întrerupere
UM3029 – Rev 1
UM3029
Driverul de firmware HAL definește
pagina 52/1419
HAL_ITLINE_ADC ADC întrerupere
HAL_ITLINE_TIM1_BRK TIM1 BRK Întrerupere
HAL_ITLINE_TIM1_UPD TIM1 UPD întrerupere
HAL_ITLINE_TIM1_TRG TIM1 TRG întrerupere
HAL_ITLINE_TIM1_CCU TIM1 CCU întrerupere
HAL_ITLINE_TIM3 TIM3 întrerupere
HAL_ITLINE_TIM14 TIM14 întrerupere
HAL_ITLINE_TIM16 TIM16 întrerupere
HAL_ITLINE_TIM17 TIM17 întrerupere
HAL_ITLINE_I2C1 I2C1 Întrerupere
HAL_ITLINE_SPI1 SPI1 întrerupere
HAL_ITLINE_USART1 USART1 GLB întrerupere
HAL_ITLINE_USART2 USART2 GLB întrerupere
Remaparea PIN SYSCFG_REMAP_PA11
Pad-ul PA11 se comportă digital ca pinul GPIO PA9 SYSCFG_REMAP_PA12
Pad-ul PA12 se comportă digital ca pin PA10 GPIO
Definiția stării HAL HAL_SMBUS_STATE_RESET
SMBUS nu a fost încă inițializat sau dezactivat HAL_SMBUS_STATE_READY
SMBUS inițializat și gata de utilizare HAL_SMBUS_STATE_BUSY
Procesul intern SMBUS este în desfășurare
UM3029 – Rev 1
UM3029
Driverul de firmware HAL definește
pagina 53/1419
UM3029
Driverul de firmware HAL definește
HAL_SMBUS_STATE_MASTER_BUSY_TX Procesul de transmitere a datelor de bază este în desfășurare
HAL_SMBUS_STATE_MASTER_BUSY_RX Procesul de recepție a datelor de bază este în desfășurare
HAL_SMBUS_STATE_SLAVE_BUSY_TX Procesul de transmitere a datelor slave este în desfășurare
HAL_SMBUS_STATE_SLAVE_BUSY_RX Procesul de recepție a datelor slave este în desfășurare
HAL_SMBUS_STATE_TIMEOUT Stare de expirare
HAL_SMBUS_STATE_ERROR Procesul de recepție este în desfășurare
HAL_SMBUS_STATE_LISTEN Modul de ascultare a adresei este în desfășurare
Frecvența de bifare HAL_TICK_FREQ_10HZ
HAL_TICK_FREQ_100HZ
HAL_TICK_FREQ_1KHZ
HAL_TICK_FREQ_DEFAULT
Modul de pornire SYSCFG_BOOT_MAINFLASH
Memoria flash principală mapată la 0x0000 0000 SYSCFG_BOOT_SYSTEMFLASH
Memoria flash de sistem mapată la 0x0000 0000 SYSCFG_BOOT_SRAM
SRAM încorporat mapat la 0x0000 0000
Întrerupeți SYSCFG_BREAK_LOCKUP
Activează și blochează ieșirea LOCKUP a CortexM0+ cu intrare Break a TIM1/16/17
Macro-urile exportate SYSCFG __HAL_GET_PENDING_IT
Note: · Permite determinarea sursei de întrerupere pe linie.
__HAL_SYSCFG_REMAPMEMORY_FLASH
__HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH
UM3029 – Rev 1
pagina 54/1419
UM3029
Driverul de firmware HAL definește
__HAL_SYSCFG_REMAPMEMORY_SRAM
__HAL_SYSCFG_GET_BOOT_MODE Descriere: · Returnează modul de pornire configurat de utilizator. Valoare returnată: · Modul de pornire conform configurației utilizatorului. Valoarea returnată poate fi una dintre următoarele valori
__HAL_SYSCFG_BREAK_LOCKUP_LOCK Note: · Configurația selectată este blocată și poate fi deblocată numai prin resetarea sistemului. Activează și blochează conexiunea ieșirii Cortex-M0+ LOCKUP (Hardfault) la intrarea Break TIM1/16/17
__HAL_SYSCFG_FASTMODEPLUS_ENABLE Descriere: · Capacitatea de conducere Fast-Mode Plus activa/dezactivează macrocomenzi. Parametri: · __FASTMODEPLUS__: Acest parametru poate fi o valoare a
__HAL_SYSCFG_FASTMODEPLUS_DISABLE
__HAL_SYSCFG_IRDA_ENV_SELECTION Descriere: · selectarea macrocomenzii semnalului anvelopei de modulație, folosind biții [7:6] ai registrului SYSCFG_CFGR1 Parametri: · __SOURCE__: Acest parametru poate fi o valoare de
__HAL_SYSCFG_GET_IRDA_ENV_SELECTION
__HAL_SYSCFG_IRDA_OUT_POLARITY_SELECTION Descriere: · Selectarea polarității IROut, folosind bit[5] din registrul SYSCFG_CFGR1. Parametri: · __SEL__: Acest parametru poate fi o valoare a
__HAL_SYSCFG_GET_POLARITY Descriere: · Returnează modul IROout Polarity conform configurației utilizatorului. Valoarea returnată: · Polaritatea IROut conform configurației utilizatorului. Valoarea returnată poate fi una dintre
__HAL_SYSCFG_BREAK_ENABLE Descriere: · Întrerupeți intrarea în funcția de activare/dezactivare a macrocomenzilor TIM1/16/17. Parametri: · __BREAK__: Acest parametru poate fi o valoare a
__HAL_SYSCFG_BREAK_DEZACTIVAT
Mod rapid Plus pe GPIO
SYSCFG_FASTMODEPLUS_PB6 Activați modul rapid Plus pe PB6
UM3029 – Rev 1
pagina 55/1419
SYSCFG_FASTMODEPLUS_PB7 Activați modul rapid Plus pe PB7
SYSCFG_FASTMODEPLUS_PB8 Activați modul rapid Plus pe PB8
SYSCFG_FASTMODEPLUS_PB9 Activați modul rapid Plus pe PB9
SYSCFG_FASTMODEPLUS_PA9 Activați modul rapid Plus pe PA9
SYSCFG_FASTMODEPLUS_PA10 Activați modul rapid Plus pe PA10
SYSCFG_FASTMODEPLUS_PC14 Activați modul rapid Plus pe PC14
Modul rapid Plus activarea capacității de conducere pentru I2Cx SYSCFG_FASTMODEPLUS_I2C1
Activați modul rapid Plus pe I2C1
UM3029
Driverul de firmware HAL definește
UM3029 – Rev 1
pagina 56/1419
7
Driver generic HAL ADC
UM3029
Driver generic HAL ADC
7.1
7.1.1
7.1.2
Driverul ADC Firmware înregistrează structuri
ADC_OversamplingTypeDef ADC_OversamplingTypeDef este definit în câmpurile de date stm32c0xx_hal_adc.h · uint32_t Ratio · uint32_t RightBitShift · uint32_t TriggeredMode Field Documentation · uint32_t ADC_OversamplingTypeDef::Ratio
Configurează over-urileampraportul ling. Acest parametru poate fi o valoare a ADC_HAL_EC_OVS_RATIO · uint32_t ADC_OversamplingTypeDef::RightBitShift
Configura coeficientul de divizare pentru Oversampler. Acest parametru poate fi o valoare a ADC_HAL_EC_OVS_SHIFT · uint32_t ADC_OversamplingTypeDef::TriggeredMode Selectează over-urile declanșate obișnuiteampmodul ling. Acest parametru poate fi o valoare a ADC_HAL_EC_OVS_DISCONT_MODE
ADC_InitTypeDef ADC_InitTypeDef este definit în câmpurile de date stm32c0xx_hal_adc.h · uint32_t ClockPrescaler · uint32_t Rezoluție · uint32_t DataAlign · uint32_t ScanConvMode · uint32_t · FunctionalState ContinuousConvMode · uint32_t NbrOfConversion · FunctionalState DiscontinuousConvMode · uint32_t ExternalTrigConv · uint32_t ExternalTrigConvEdge · FunctionalState DMAContinuousRequests · uint32_t Depășire · uint32_t SamplingTimeCommon1 · uint32_t SamplingTimeCommon2 · FunctionalState OversamplingMode · ADC_OversamplingTypeDef Oversampling · uint32_t Documentația de câmp TriggerFrequencyMode
UM3029 – Rev 1
pagina 57/1419
UM3029
Driverul ADC Firmware înregistrează structuri
· uint32_t ADC_InitTypeDef::ClockPrescaler
Selectați sursa de ceas ADC (ceasul sincron derivat din ceasul APB sau ceasul asincron derivat din ceasul de sistem sau PLL (Consultați manualul de referință pentru lista de ceasuri disponibile)) și prescalerul de ceas. Acest parametru poate fi o valoare a ADC_HAL_EC_COMMON_CLOCK_SOURCE. Notă: Configurația ceasului ADC este comună tuturor instanțelor ADC. Notă: În cazul modului de ceas sincron bazat pe HCLK/1, configurația trebuie să fie activată numai dacă ceasul sistemului are un ciclu de ceas de lucru de 50% (prescalerul APB configurat în interiorul RCC trebuie să fie ocolit, iar ceasul PCLK trebuie să aibă un ciclu de lucru de 50%). . Consultați manualul de referință pentru detalii. Notă: În cazul utilizării ceasului asincron, ceasul selectat trebuie să fie activat preliminar la nivelul superior RCC. Notă: Acest parametru poate fi modificat numai dacă toate instanțele ADC sunt dezactivate.
· uint32_t ADC_InitTypeDef::Rezoluție
Configurați rezoluția ADC. Acest parametru poate fi o valoare a ADC_HAL_EC_RESOLUTION
· uint32_t ADC_InitTypeDef::DataAlign
Specificați alinierea datelor ADC în registrul de date de conversie (dreapta sau stânga). Consultați manualul de referință pentru formatele de aliniere față de rezoluții. Acest parametru poate fi o valoare a ADC_HAL_EC_DATA_ALIGN
· uint32_t ADC_InitTypeDef::ScanConvMode
Configurați secvențatorul grupului ADC regulat. Pe această serie STM32, secvențiatorul obișnuit de grup ADC sunt disponibile ambele moduri „complet configurabil” sau „necomplet configurabil”:
Sequencer configurat să fie complet configurabil: lungimea secvenței și fiecare afectare a rangului pe un canal sunt configurabile.
Lungimea secvenței: setați numărul de ranguri în secvența de scanare.
Direcția secvenței: Dacă nu este specificat în parametri, direcția de scanare a secvenței este înainte (de la rangul 1 la rangul n).
Sequencerul configurat să nu fie complet configurabil: lungimea secvenței și fiecare afectare a rangului unui canal sunt fixate de numărul HW al canalului.
Lungimea secvenței: numărul de ranguri din secvența de scanare este definit de numărul de canale setate în secvență, rangul fiecărui canal este fixat de numărul HW al canalului. (canalul 0 fixat pe rangul 0, canalul 1 fixat pe rangul 1, …).
Direcția secvenței: Dacă nu este specificat în parametri, direcția de scanare a secvenței este înainte (de la cel mai mic număr de canal la cel mai mare număr de canal). Acest parametru poate fi asociat cu parametrul „DiscontinuousConvMode” pentru a avea secvența principală subdivizată în părți succesive. Sequencerul este activat automat dacă sunt setate mai multe canale (sequencerul nu poate fi dezactivat, așa cum poate fi cazul altor dispozitive STM32): Dacă este setat doar 1 canal: Conversia se realizează în mod unic. Dacă sunt setate mai multe canale: Conversiile sunt efectuate în modul secvență. Acest parametru poate fi o valoare a ADC_Scan_mode
· uint32_t ADC_InitTypeDef::EOCSelection
Specificați ce flag EOC (Sfârșitul conversiei) este utilizat pentru conversie prin interogare și întrerupere: sfârșitul conversiei unitare sau sfârșitul conversiilor secvenței. Acest parametru poate fi o valoare a ADC_EOCSelection.
· FunctionalState ADC_InitTypeDef::LowPowerAutoWait
Selectați întârzierea automată dinamică de putere redusă: noua conversie începe numai când conversia anterioară (pentru grupul ADC obișnuit) a fost preluată de software-ul utilizatorului, utilizând funcția HAL_ADC_GetValue(). Această caracteristică adaptează automat frecvența declanșatoarelor conversiilor ADC la viteza sistemului care citește datele. În plus, acest lucru evită riscul de depășire pentru aplicațiile cu frecvență joasă. Acest parametru poate fi setat la ENABLE sau DISABLE. Notă: Nu este recomandat să utilizați cu întrerupere sau DMA (HAL_ADC_Start_IT(), HAL_ADC_Start_DMA()), deoarece aceste moduri trebuie să șterge imediat steag-ul EOC (de către CPU pentru a elibera evenimentul IRQ în așteptare sau prin DMA). Așteptarea automată va funcționa, dar pentru o perioadă foarte scurtă de timp, eliminând beneficiul dorit (cu excepția cazului specific de încărcare mare a CPU-ului sau a transferurilor DMA care pot justifica utilizarea așteptării automate). Folosiți cu sondaj: 1. Începeți conversia cu HAL_ADC_Start(), 2. Mai târziu, când sunt necesare date de conversie ADC: utilizați HAL_ADC_PollForConversion() pentru a vă asigura că conversia este finalizată și HAL_ADC_GetValue() pentru a prelua rezultatul conversiei și a declanșa o altă conversie.
· FunctionalState ADC_InitTypeDef::LowPowerAutoPowerOff
Selectați modul de oprire automată: ADC-ul se oprește automat după o conversie și se trezește automat când este declanșată o nouă conversie (cu timpul de pornire între declanșare și începutul lui sampling). Această caracteristică poate fi combinată cu modul automat de așteptare (parametrul „LowPowerAutoWait”). Acest parametru poate fi setat la ENABLE sau DISABLE. Notă: Dacă este activată, această caracteristică oprește și oscilatorul RC dedicat ADC de 14 MHz (HSI14)
UM3029 – Rev 1
pagina 58/1419
UM3029
Driverul ADC Firmware înregistrează structuri
· FunctionalState ADC_InitTypeDef::ContinuousConvMode
Specificați dacă conversia este efectuată în modul unic (o conversie) sau în modul continuu pentru grupul ADC obișnuit, după ce a avut loc primul declanșator de pornire a conversiei ADC (pornire software sau declanșare extern). Acest parametru poate fi setat la ENABLE sau DISABLE.
· uint32_t ADC_InitTypeDef::NbrOfConversion
Specificați numărul de ranguri care vor fi convertite în secvențatorul de grup obișnuit. Acest parametru depinde de ScanConvMode:
Sequencerul configurat să fie complet configurabil: numărul de ranguri din secvența de scanare este configurabil folosind acest parametru. Notă: După primul apel al lui „HAL_ADC_Init()”, fiecare rang corespunzător parametrului „NbrOfConversion” trebuie setat folosind „HAL_ADC_ConfigChannel()”. Ulterior, când toate rangurile de secvențiere necesare sunt setate, parametrul „NbrOfConversion” poate fi actualizat fără modificarea configurației rangurilor de secvențiere (ranjurile de secvențiere de deasupra „NbrOfConversion” sunt eliminate).
Sequencer configurat să nu fie complet configurabil: numărul de ranguri din secvența de scanare este definit de numărul de canale setate în secvență. Acest parametru este eliminat. Acest parametru trebuie să fie un număr între Min_Data = 1 și Max_Data = 8. Notă: Acest parametru trebuie modificat atunci când nu este în curs de conversie în grupul obișnuit (ADC dezactivat sau ADC activat fără modul continuu sau declanșator extern care ar putea lansa o conversie) .
· FunctionalState ADC_InitTypeDef::DiscontinuousConvMode
Specificați dacă secvența de conversie a grupului ADC obișnuit este efectuată în secvență completă/secvență discontinuă (secvența principală subdivizată în părți succesive). Modul discontinuu este utilizat numai dacă sequencerul este activat (parametrul „ScanConvMode”). Dacă sequencerul este dezactivat, acest parametru este eliminat. Modul discontinuu poate fi activat numai dacă modul continuu este dezactivat. Dacă modul continuu este activat, această setare a parametrului este eliminată. Acest parametru poate fi setat la ENABLE sau DISABLE. Notă: Pe această serie STM32, numărul regulat al grupului ADC de increment de ranguri discontinue este fixat la unul câte unul.
· uint32_t ADC_InitTypeDef::ExternalTrigConv
Selectați sursa de eveniment extern utilizată pentru a declanșa începerea obișnuită a conversiei grupului ADC. Dacă se setează la ADC_SOFTWARE_START, declanșatoarele externe sunt dezactivate și se folosește în schimb declanșatorul software. Acest parametru poate fi o valoare a ADC_regular_external_trigger_source. Atenție: sursa externă de declanșare este comună tuturor instanțelor ADC.
· uint32_t ADC_InitTypeDef::ExternalTrigConvEdge
Selectați marginea evenimentului extern folosit pentru a declanșa începerea obișnuită a conversiei grupului ADC. Dacă sursa de declanșare este setată la ADC_SOFTWARE_START, acest parametru este eliminat. Acest parametru poate fi o valoare a lui ADC_regular_external_trigger_edge
· FunctionalState ADC_InitTypeDef::DMAContinuousRequests
Specificați dacă solicitările DMA sunt efectuate în modul one shot (transferul DMA se oprește când este atins numărul de conversii) sau în modul continuu (transfer DMA nelimitat, indiferent de numărul de conversii). Acest parametru poate fi setat la ENABLE sau DISABLE. Notă: În modul continuu, DMA trebuie configurat în modul circular. În caz contrar, o depășire va fi declanșată când este atins indicatorul maxim al bufferului DMA.
· uint32_t ADC_InitTypeDef::Overrun
Selectați comportamentul în caz de depășire: date suprascrise sau păstrate (implicit). Acest parametru poate fi o valoare a ADC_HAL_EC_REG_OVR_DATA_BEHAVIOR. Notă: În cazul depășirii setate la datele păstrate și utilizarea cu modelul de programare cu întrerupere (HAL_Start_IT()): handler-ul ADC IRQ trebuie să șterge steaguri de sfârșit de conversie, acest lucru induce eliberarea datelor păstrate. Dacă este necesar, aceste date pot fi salvate în funcția HAL_ADC_ConvCpltCallback(), plasată în codul programului utilizator (apelat înainte de ștergerea indicatorilor de sfârșit de conversie). Notă: Raportarea erorilor în ceea ce privește modul de conversie:
Utilizare cu conversie ADC prin interogare pentru eveniment sau întrerupere: eroarea este raportată numai dacă depășirea este setată la datele păstrate. Dacă depășirea este setată la date suprascrise, utilizatorul nu poate citi de bunăvoie toate datele convertite, acest lucru nu este considerat un caz eronat.
Utilizare cu conversie ADC de către DMA: eroarea este raportată indiferent de setarea de depășire (se așteaptă ca DMA să proceseze toate datele din registrul de date).
UM3029 – Rev 1
pagina 59/1419
7.1.3
UM3029
Driverul ADC Firmware înregistrează structuri
· uint32_t ADC_InitTypeDef::SamplingTimeCommon1 Set samptimp de ling comun unui grup de canale. Unitate: Cicluri de ceas ADC Timpul de conversie este adăugarea de samptimp de ling și timpul de procesare (12.5 cicluri de ceas ADC la rezoluție ADC 12 biți, 10.5 cicluri la 10 biți, 8.5 cicluri la 8 biți, 6.5 cicluri la 6 biți). Notă: Pe această familie STM32, două sampsetările de timp sunt disponibile, fiecare canal poate utiliza una dintre aceste două setări. Pe alte dispozitive STM32, acest parametru este în funcție de canal și este localizat în structura de inițializare a canalului ADC. Acest parametru poate fi o valoare a ADC_HAL_EC_CHANNEL_SAMPLINGTIME Notă: În cazul utilizării canalelor interne de măsurare (VrefInt/Vbat/TempSensor), sampconstrângerile de timp trebuie respectate (artamptimpul de ling poate fi ajustat în funcție de frecvența ceasului ADC și sampling time setting) Consultați fișa tehnică a dispozitivului pentru valorile de timp, parametrii TS_vrefint, TS_vbat, TS_temp (valori în ordinea aproximativă: câteva zeci de microsecunde).
· uint32_t ADC_InitTypeDef::SamplingTimeCommon2 Set sampDurată de ling comună unui grup de canale, posibilă a doua setare comună. Unitate: Cicluri de ceas ADC Timpul de conversie este adăugarea de samptimp de ling și timpul de procesare (12.5 cicluri de ceas ADC la rezoluție ADC 12 biți, 10.5 cicluri la 10 biți, 8.5 cicluri la 8 biți, 6.5 cicluri la 6 biți). Notă: Pe această familie STM32, două sampsetările de timp sunt disponibile, fiecare canal poate utiliza una dintre aceste două setări. Pe alte dispozitive STM32, acest parametru este în funcție de canal și este localizat în structura de inițializare a canalului ADC. Acest parametru poate fi o valoare a ADC_HAL_EC_CHANNEL_SAMPLINGTIME Notă: În cazul utilizării canalelor interne de măsurare (VrefInt/Vbat/TempSensor), sampconstrângerile de timp trebuie respectate (artamptimpul de ling poate fi ajustat în funcție de frecvența ceasului ADC și sampling time setting) Consultați fișa tehnică a dispozitivului pentru valorile de timp, parametrii TS_vrefint, TS_vbat, TS_temp (valori în ordinea aproximativă: câteva zeci de microsecunde).
· FunctionalState ADC_InitTypeDef::OversamplingMode Specificați dacă oversampcaracteristica ling este activată sau dezactivată. Acest parametru poate fi setat la ENABLE sau DISABLE. Notă: Acest parametru poate fi modificat numai dacă nu există nicio conversie în curs de desfășurare în grupul ADC obișnuit.
· ADC_OversamplingTypeDef ADC_InitTypeDef::Oversampling Specificați Oversampparametrii ling. Atenție: această setare suprascrie suprascrierile anterioareampling configurație dacă oversampLing este deja activat.
· uint32_t ADC_InitTypeDef::TriggerFrequencyMode Setați modul de frecvență de declanșare ADC. Acest parametru poate fi o valoare a ADC_HAL_EC_REG_TRIGGER_FREQ. Notă: modul de frecvență de declanșare ADC trebuie setat la frecvență joasă atunci când o durată este depășită înainte de evenimentul de declanșare a pornirii conversiei ADC (între activarea ADC și evenimentul de declanșare a pornirii conversiei ADC sau între două evenimente de declanșare a conversiei ADC). Valoarea duratei: Consultați fișa tehnică a dispozitivului, parametrul „tIdle”. Notă: Când modul de frecvență de declanșare ADC este setat la frecvență joasă, unele cicluri de rearmare sunt introduse înainte de a efectua începerea conversiei ADC, inducând o întârziere de 2 cicluri de ceas ADC.
ADC_ChannelConfTypeDef ADC_ChannelConfTypeDef este definit în câmpurile de date stm32c0xx_hal_adc.h
· Canal uint32_t · Rang uint32_t · uint32_t SamplingTime
Documentatie de teren
· uint32_t ADC_ChannelConfTypeDef::Channel Specificați canalul de configurat în grupul normal ADC. Acest parametru poate fi o valoare a ADC_HAL_EC_CHANNEL Notă: În funcție de dispozitive și de instanțe ADC, este posibil ca unele canale să nu fie disponibile pe pinii pachetului dispozitivului. Consultați fișa tehnică a dispozitivului pentru disponibilitatea canalelor.
· uint32_t ADC_ChannelConfTypeDef::Rank Adăugați sau eliminați canalul din sequencerul de grup obișnuit ADC și specificați rangul său de conversie. Acest parametru depinde de ScanConvMode:
Sequencer configurat să fie complet configurabil: ordonarea canalelor în fiecare rang al secvenței de scanare: orice canal poate fi plasat în orice rang.
Sequencerul configurat să nu fie complet configurabil: rangul fiecărui canal este fixat de numărul HW al canalului. (canalul 0 fixat pe rangul 0, canalul 1 fixat pe rangul 1, …). În ciuda faptului că rangul canalului este fix, acest parametru oferă o posibilitate suplimentară: de a elimina rangul selectat (canalul selectat) din secvențier. Acest parametru poate fi o valoare a ADC_HAL_EC_REG_SEQ_RANKS
UM3029 – Rev 1
pagina 60/1419
7.1.4
UM3029
Driverul ADC Firmware înregistrează structuri
· uint32_t ADC_ChannelConfTypeDef::SamplingTime
Sampvaloare de timp de ling care trebuie setată pentru canalul selectat. Unitate: Cicluri de ceas ADC Timpul de conversie este adăugarea de samptimp de ling și timpul de procesare (12.5 cicluri de ceas ADC la rezoluție ADC 12 biți, 10.5 cicluri la 10 biți, 8.5 cicluri la 8 biți, 6.5 cicluri la 6 biți). Acest parametru poate fi o valoare a lui ADC_HAL_EC_SAMPLINGTIME_COMMON Notă: în această familie STM32, două s-uri diferiteampSunt disponibile setările de timp de ling (consultați parametrii „SamplingTimeCommon1” și „SamplingTimeCommon2”), fiecare canal poate utiliza una dintre aceste două setări. Notă: În cazul utilizării canalelor interne de măsurare (VrefInt/Vbat/TempSensor), sampconstrângerile de timp trebuie respectate (artamptimpul de ling poate fi ajustat în funcție de frecvența ceasului ADC și sampling time setting) Consultați fișa tehnică a dispozitivului pentru valorile timpilor.
ADC_AnalogWDGConfTypeDef ADC_AnalogWDGConfTypeDef este definit în stm32c0xx_hal_adc.h
Câmpuri de date
· uint32_t WatchdogNumber
· uint32_t WatchdogMode
· Canal uint32_t
· FunctionalState ITMode
· uint32_t HighThreshold
· uint32_t Low Threshold
Documentatie de teren
· uint32_t ADC_AnalogWDGConfTypeDef::WatchdogNumber
Selectați ce watchdog analogic ADC monitorizează canalul selectat. Pentru Watchdog Analog 1: Doar 1 canal poate fi monitorizat (sau un grup total de canale prin setarea parametrului „WatchdogMode”). Acest parametru poate fi o valoare de ADC_HAL_EC_AWD_NUMBER.
· uint32_t ADC_AnalogWDGConfTypeDef::WatchdogMode
Configurați modul watchdog analogic ADC: canale unice/toate/niciun. Pentru Analog Watchdog 1: Configurați modul analog Watchdog ADC: un singur canal sau toate canalele, grup ADC obișnuit. Pentru Analog Watchdog 2 și 3: mai multe canale pot fi monitorizate prin aplicarea succesivă a structurii AWD init. Acest parametru poate fi o valoare a ADC_analog_watchdog_mode.
· uint32_t ADC_AnalogWDGConfTypeDef::Channel
Selectați ce canal ADC să monitorizați prin watchdog analogic. Pentru Analog Watchdog 1: acest parametru are efect numai dacă parametrul „WatchdogMode” este configurat pe un singur canal (doar 1 canal poate fi monitorizat). Pentru Analog Watchdog 2 și 3: mai multe canale pot fi monitorizate. Pentru a utiliza această caracteristică, apelați succesiv funcția HAL_ADC_AnalogWDGConfig() pentru fiecare canal de adăugat (sau eliminat cu valoarea „ADC_ANALOGWATCHDOG_NONE”). Acest parametru poate fi o valoare a ADC_HAL_EC_CHANNEL.
· FunctionalState ADC_AnalogWDGConfTypeDef::ITMode
Specificați dacă watchdog-ul analogic este configurat în modul întrerupere sau interogare. Acest parametru poate fi setat la ENABLE sau DISABLE
· uint32_t ADC_AnalogWDGConfTypeDef::HighThreshold
Configurați valoarea de prag înaltă a watchdog-ului analogic ADC. În funcție de rezoluția ADC selectată (12, 10, 8 sau 6 biți), acest parametru trebuie să fie un număr între Min_Data = 0x000 și Max_Data = 0xFFF, 0x3FF, 0xFF sau respectiv 0x3F. Notă: Watchdog-urile analogice 2 și 3 sunt limitate la o rezoluție de 8 biți: dacă rezoluția ADC este de 12 biți, cei 4 LSB sunt ignorați, dacă rezoluția ADC este de 10 biți, cei 2 LSB sunt ignorați. Notă: Dacă ADC depășeșteamplingul este activat, pragurile ADC watchdog analogice sunt afectate: compararea pragurilor watchdog analogic se face pe depășiriampcalcul final (după aplicarea raportului și a deplasării): câmpul de biți al registrului de date ADC [15:4] (12 biți cei mai semnificativi).
· uint32_t ADC_AnalogWDGConfTypeDef::LowThreshold
Configurați valoarea pragului scăzut al watchdog-ului analog ADC. În funcție de rezoluția ADC selectată (12, 10, 8 sau 6 biți), acest parametru trebuie să fie un număr între Min_Data = 0x000 și Max_Data = 0xFFF, 0x3FF, 0xFF sau respectiv 0x3F. Notă: Watchdog-urile analogice 2 și 3 sunt limitate la o rezoluție de 8 biți: dacă rezoluția ADC este de 12 biți, cei 4 LSB sunt ignorați, dacă rezoluția ADC este de 10 biți, cei 2 LSB sunt ignorați. Notă: Dacă ADC depășeșteamplingul este activat, pragurile ADC watchdog analogice sunt afectate: compararea pragurilor watchdog analogic se face pe depășiriampcalcul final (după aplicarea raportului și a deplasării): câmpul de biți al registrului de date ADC [15:4] (12 biți cei mai semnificativi).
UM3029 – Rev 1
pagina 61/1419
7.1.5
UM3029
Driverul ADC Firmware înregistrează structuri
__ADC_HandleTypeDef __ADC_HandleTypeDef este definit în câmpurile de date stm32c0xx_hal_adc.h · ADC_TypeDef * Instanță · ADC_InitTypeDef Init · DMA_HandleTypeDef * DMA_HandleTypeDef * DMA_HandleTypeDef · H_32_IO_TypeDef Starea · H__32_IO _IO uint32_t ErrorCode · uint2_t ADCGroupRegularSequencerRanks · void(* ConvCpltCallback · void(* ConvHalfCpltCallback · void(* LevelOutOfWindowCallback · void(* ErrorCallback · void(* LevelOutOfWindow3Callback · void(* LevelOutOfWindowXNUMXCallback · void(* EndOfS)amplingCallback · void(* MspInitCallback · void(* MspDeInitCallback Field Documentation · ADC_TypeDef* __ADC_HandleTypeDef::Instance
Înregistrați adresa de bază · ADC_InitTypeDef __ADC_HandleTypeDef::Init
Parametrii de inițializare ADC și setarea conversiilor obișnuite · DMA_HandleTypeDef* __ADC_HandleTypeDef::DMA_Handle
Pointer DMA Handler · HAL_LockTypeDef __ADC_HandleTypeDef::Lock
Obiect de blocare ADC · __IO uint32_t __ADC_HandleTypeDef::State
Stare de comunicare ADC (bitmap a stărilor ADC) · __IO uint32_t __ADC_HandleTypeDef::ErrorCode
Cod de eroare ADC · uint32_t __ADC_HandleTypeDef::ADCGroupRegularSequencerRanks
Memorarea obișnuită a grupului ADC a setărilor de ranguri, folosită în modul „complet configurabil” (consultați parametrul „ScanConvMode”) · void(* __ADC_HandleTypeDef::ConvCpltCallback)(struct __ADC_HandleTypeDef *hadc) Conversie ADC completă callback:_yCallback:_y_* ConvHalfCpltCallback)(struct __ADC_HandleTypeDef *hadc) Conversie ADC DMA semi-transfer apel invers · void(* __ADC_HandleTypeDef::LevelOutOfWindowCallback)(struct __ADC_HandleTypeDef *hadleTypeDef DC *had_watchd_) leTypeDef::ErrorCallback)(struct __ADC_HandleTypeDef *hadc) ADC eroare apel invers · void(* __ADC_HandleTypeDef::LevelOutOfWindow1Callback)(struct __ADC_HandleTypeDef *hadc) ADC analog watchdog 2 callback · void(* __ADC_HandleTypeDef::WindowTypeDef::Window)(ADC_HandleTypeDef::Window) Def *hadc) ADC analog watchdog 2 callback · void(* __ADC_HandleTypeDef:: EndOfSamplingCallback)(struct __ADC_HandleTypeDef *hadc) ADC sfârşitul lui sampling apel invers
UM3029 – Rev 1
pagina 62/1419
7.2
7.2.1
7.2.2
UM3029
Descrierea API a driverului ADC Firmware
· void(* __ADC_HandleTypeDef::MspInitCallback)(struct __ADC_HandleTypeDef *hadc) ADC Msp Init apel invers
· void(* __ADC_HandleTypeDef::MspDeInitCallback)(struct __ADC_HandleTypeDef *hadc) ADC Msp DeInit apel invers
Descrierea API a driverului ADC Firmware
Următoarea secțiune listează diferitele funcții ale bibliotecii ADC.
Caracteristici periferice ADC
· Rezoluție configurabilă pe 12 biți, 10 biți, 8 biți sau 6 biți. · Generarea întreruperii la sfârșitul conversiei obișnuite și în cazul evenimentelor analogice watchdog sau depășire. · Moduri de conversie unică și continuă. · Modul de scanare pentru conversia mai multor canale secvenţial. · Alinierea datelor cu coerența încorporată a datelor. · s programabilamptimp de ling (comun grupului de canale) · Declanșator extern (temporizator sau EXTI) cu polaritate configurabilă · Generarea cererii DMA pentru transferul datelor de conversie ale grupului obișnuit. · Calibrare ADC · Conversie ADC a grupului obișnuit. · Cerințe de alimentare ADC: 1.62 V până la 3.6 V. · Domeniu de intrare ADC: de la Vref- (conectat la Vssa) la Vref+ (conectat la Vdda sau la un vol externtage
referinţă).
Cum se utilizează acest driver
Configurarea parametrilor de nivel superior legat de ADC
1. Activați interfața ADC Ca o condiție prealabilă, ceasul ADC trebuie configurat la nivelul superior RCC. Atenție: Pe STM32C0, frecvența maximă de ceas ADC este de 35 MHz (consultați fișa tehnică a dispozitivului). Prin urmare, sursa de ceas ADC de la RCC și prescalerul de ceas ADC trebuie configurate pentru a rămâne sub această frecvență maximă. Două setări ale ceasului sunt obligatorii: ceas ADC (ceasul de bază, eventual și ceasul de conversie). Ceas ADC (ceasul de conversie). Patru surse de ceas posibile: ceas sincron de la ceasul APB (la fel ca ceasul de bază ADC) sau ceas asincron de la nivelul RCC: SYSCLK, HSI48. Example: În HAL_ADC_MspInit() (locația recomandată a codului) sau cu alte configurații ale parametrilor ceasului dispozitivului: __HAL_RCC_ADC_CLK_ENABLE(); (obligatoriu: ceas de bază) Sursa de ceas ADC și prescalerul de ceas sunt configurate la nivel ADC cu parametrul „ClockPrescaler” folosind funcția HAL_ADC_Init().
2. Configurarea pinilor ADC Activați ceasul pentru GPIO-urile ADC utilizând macro-ul __HAL_RCC_GPIOx_CLK_ENABLE() Configurați acești pini ADC în modul analog folosind funcția HAL_GPIO_Init()
3. Opțional, în cazul utilizării ADC cu întreruperi: Configurați NVIC pentru ADC utilizând funcția HAL_NVIC_EnableIRQ(ADCx_IRQn) Introduceți funcția de gestionare a întreruperilor ADC HAL_ADC_IRQHandler() în funcția vectorului de întrerupere ADC corespunzător ADCx_IRQHandler().
4. Opțional, în cazul utilizării DMA: Configurați DMA (canal DMA, mod normal sau circular, …) folosind funcția HAL_DMA_Init(). Configurați NVIC pentru DMA utilizând funcția HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn) Introduceți funcția de gestionare a întreruperilor ADC HAL_ADC_IRQHandler() în funcția vectorului de întrerupere DMA corespunzător DMAx_Channelx_IRQHandler().
UM3029 – Rev 1
pagina 63/1419
UM3029
Descrierea API a driverului ADC Firmware
Nota:
Configurarea parametrilor ADC, grup regulat, canale
1. Configurați parametrii ADC (rezoluție, alinierea datelor, …) și parametrii obișnuiți ai grupului (declanșator de conversie, secvenționar, …) utilizând funcția HAL_ADC_Init().
2. Configurați canalele pentru parametrii grupului obișnuit (numărul canalului, rangul canalului în secvențier, …, în grup obișnuit) utilizând funcția HAL_ADC_ConfigChannel().
3. Opțional, configurați parametrii watchdog analogici (canale monitorizate, praguri, …) utilizând funcția HAL_ADC_AnalogWDGConfig().
Executarea conversiilor ADC
1. Opțional, efectuați o calibrare automată ADC pentru a îmbunătăți acuratețea conversiei utilizând funcția HAL_ADCEx_Calibration_Start().
2. Driverul ADC poate fi utilizat între trei moduri: interogare, întrerupere, transfer prin DMA. Conversie ADC prin sondaj: Activați perifericul ADC și începeți conversiile utilizând funcția HAL_ADC_Start() Așteptați finalizarea conversiei ADC folosind funcția HAL_ADC_PollForConversion() Preluați rezultatele conversiei folosind funcția HAL_ADC_GetValue() Opriți conversia și dezactivați perifericul ADC folosind funcția HAL_ADC_Stop() ADC_Stop întrerupere: Activați perifericul ADC și începeți conversiile utilizând funcția HAL_ADC_Start_IT() Așteptați finalizarea conversiei ADC prin apelarea funcției HAL_ADC_ConvCpltCallback() (această funcție trebuie implementată în programul utilizatorului) Preluați rezultatele conversiei folosind funcția HAL_ADC_GetValue() Opriți conversia și dezactivați ADC periferic utilizând funcția HAL_ADC_Stop_IT() Conversie ADC cu transfer prin DMA: Activați perifericul ADC și începeți conversiile utilizând funcția HAL_ADC_Start_DMA() Așteptați finalizarea conversiei ADC prin apelarea funcției HAL_ADC_ConvCpltCallback() sau HAL_ADC_ConvHalfCplt() sau HAL_ADC_ConvHalfCpl() programul trebuie implementat în acest program ) Rezultatele conversiei sunt transferate automat de DMA în adresa variabilei de destinație. Opriți conversia și dezactivați perifericul ADC folosind funcția HAL_ADC_Stop_DMA()
Funcțiile de apel invers trebuie implementate în programul utilizatorului: · HAL_ADC_ErrorCallback() · HAL_ADC_LevelOutOfWindowCallback() (apel invers al watchdog-ului analog) · HAL_ADC_ConvCpltCallback() · HAL_ADC_ConvHalfCpltCallback
Deinițializarea ADC
1. Dezactivați interfața ADC Ceasul ADC poate fi resetat complet și dezactivat la nivelul superior RCC. Resetare hardware a perifericelor ADC folosind macro __ADCx_FORCE_RESET(), __ADCx_RELEASE_RESET(). Dezactivarea ceasului ADC folosind macro/funcțiile echivalente ca pas de configurare. Example: În HAL_ADC_MspDeInit() (locația recomandată a codului) sau cu alte configurații ale parametrilor ceasului dispozitivului: RCC_OscInitStructure.OscillatorType = RCC_OSCILLATORTYPE_HSI14; RCC_OscInitStructure.HSI14State = RCC_HSI14_OFF; (dacă nu este folosit pentru ceasul de sistem) HAL_RCC_OscConfig(&RCC_OscInitStructure);
2. Configurarea pinilor ADC Dezactivați ceasul pentru GPIO-urile ADC folosind macro-ul __HAL_RCC_GPIOx_CLK_DISABLE()
3. Opțional, în cazul utilizării ADC cu întreruperi: Dezactivați NVIC pentru ADC utilizând funcția HAL_NVIC_EnableIRQ(ADCx_IRQn)
UM3029 – Rev 1
pagina 64/1419
7.2.3
UM3029
Descrierea API a driverului ADC Firmware
4. Opțional, în cazul utilizării DMA: Deinițializați DMA folosind funcția HAL_DMA_Init(). Dezactivați NVIC pentru DMA folosind funcția HAL_NVIC_EnableIRQ(DMAx_Channelx_IRQn)
Înregistrare apel invers
Indicatorul de compilare USE_HAL_ADC_REGISTER_CALLBACKS, când este setat la 1, permite utilizatorului să configureze în mod dinamic apelurile inverse ale driverului. Utilizați Funcțiile @ref HAL_ADC_RegisterCallback() pentru a înregistra un apel invers de întrerupere. Funcția @ref H
Documente/Resurse
![]() |
ST UM3029 Drivere pentru strat inferior [pdfManual de utilizare UM3029 Drivere de nivel inferior, UM3029, Drivere de nivel inferior, Drivere de strat |




