1. Concepto de operación de generación de bits, ventajas y desventajas:
Opere directamente el hardware a través de la dirección del puerto del hardware:
Ventajas: respuesta rápida, se puede aplicar a campos como la industria militar que tienen requisitos estrictos sobre el rendimiento del hardware
Desventajas: La operación es un poco más difícil, y el personal que necesita programar debe comprender y guiar cómo operar la dirección del hardware, así como otras configuraciones de hardware.
En segundo lugar, la técnica de conversión de dirección de registro y dirección de alias:
1. Determine la dirección de inicio de un acceso de puerto, por ejemplo, la dirección de inicio de acceso del puerto F es GPIOF_BASE
# define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
2. Calcule el valor de desplazamiento de acuerdo con la dirección de registro a la que se accederá, como el cálculo
Dirección de registro GPIOF ODR = GPIOF_BASE + 0x14;
3. Convertir de acuerdo con la siguiente fórmula
Registrar bit alias = 0x42000000 + (dirección de registro - 0x40000000 ) * 8 * 4 + número de pin * 4
3. Fórmula de cálculo de la operación de generación de bits:
Método uno, configure el código de nivel de pin PF9 de la siguiente manera
uint32_t * PF9_BitBand = ( uint32_t * ) ( 0x42000000 + ( GPIOF_BASE + 0x14 - 0x40000000 ) * 32 + 9 * 4 ) ;
Método dos, una solución más óptima:
uint32_t * PF9_BitBand = ( uint32_t * ) ( 0x42000000 + ( ( uint32_t ) y GPIOF -> ODR - 0x40000000 ) * 32 + 9 * 4 ) ;
El siguiente código utiliza dos métodos para operar el puerto GPIOF9, principalmente para lograr la función de luz intermitente,
#include " stm32f4xx.h " #include <stdio.h> GPIO_InitTypeDef estático GPIO_InitStructure; uint32_t * p9 = (uint32_t *) ( 0x42000000 + ((uint32_t) & GPIOF-> ODR- 0x40000000 ) * 32 + 9 * 4 ); // Obtenga la dirección del hardware por operación de generación de bits retraso nulo ( nulo ) { uint32_t i = 0x2000000 ; mientras que (i-- ); } int main ( nulo ) { // Habilitar (abrir) el reloj de hardware del puerto F, que es suministrar energía al puerto F RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOF, ENABLE); // initialize GPIO pasadores GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; // primer pasador 9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // modo de salida GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // salida push-pull, aumentar la capacidad de corriente de salida. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // Respuesta de alta velocidad GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // Las resistencias pull-up y pull-down GPIO_Init (GPIOF, y GPIO_InitStructure) no están habilitadas mientras que ( 1 ) { // PF9 pin output high level // GPIO_SetBits (GPIOF, GPIO_Pin_9); * p9 = 1 ; retrasar(); // El pin PF9 produce GPIO_ResetBits de bajo nivel (GPIOF, GPIO_Pin_9); retrasar(); } }
4. El diagrama esquemático es el siguiente: