Introdução ao STM32 (2)

Introdução ao STM32 (2)

1. Nova construção

Insira a descrição da imagem aqui

2. A relação entre o desenvolvimento da biblioteca e o desenvolvimento do registro

A biblioteca de firmware é uma coleção de funções. A função das funções da biblioteca de firmware é lidar diretamente com os registros e fornecer a interface (API) para chamadas de funções do usuário. No desenvolvimento do 51, o que costumamos fazer é manipular diretamente os registros. Por exemplo, para controlar o estado de algumas portas IO, manipulamos diretamente os registros:

P0=0x11;

No desenvolvimento do STM32, também podemos manipular os registros:

GPIOx->BRR = 0x0011;

Este método é certamente possível, mas a desvantagem deste método é que você precisa dominar o uso de cada registro para poder usar o STM32 corretamente.Para um MCU do nível STM32, é mais fácil lembrar centenas de registros. Então, ST (STMicroelectronics) lançou a biblioteca oficial de firmware. A biblioteca de firmware encapsula as operações subjacentes desses registros e fornece um conjunto completo de interfaces (API) para os desenvolvedores chamarem. Na maioria dos casos, você não precisa saber qual é operacional. Registre-se, você só precisa saber quais funções chamar. Por exemplo, o registro BRR de controle acima implementa o controle de nível, a biblioteca oficial encapsula uma função:

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin){
    
      
38GPIOx->BRR = GPIO_Pin;
}

Nesse momento, você não precisa manipular diretamente o registro BRR, você só precisa saber como usar a função GPIO_ResetBits (). Depois de ter um certo entendimento do princípio de funcionamento dos periféricos, você pode olhar para as funções da biblioteca de firmware.Basicamente, o nome da função pode dizer qual é a função dessa função e como usá-la.

Três, biblioteca oficial STM32

Existem dois diretórios na pasta Bibliotecas, CMSIS e STM32F10x_StdPeriph_Driver. Esses dois diretórios contêm todas as subpastas e arquivos do núcleo da biblioteca do firmware. Entre eles estão os arquivos de inicialização no diretório CMSIS e STM32F10x_StdPeriph_Driver coloca os arquivos de origem da biblioteca de firmware STM32. O diretório inc no diretório do arquivo de origem armazena o arquivo de cabeçalho stm32f10x_xxx.h, sem necessidade de alteração. Abaixo do diretório src está o arquivo de origem da biblioteca de firmware no formato stm32f10x_xxx.c. Cada arquivo .c corresponde a um arquivo .h correspondente.
O arquivo aqui também é o arquivo principal da biblioteca de firmware, e cada periférico corresponde a um conjunto de arquivos. Os arquivos na pasta Bibliotecas serão usados ​​quando construirmos o projeto. Existem duas pastas na pasta Projeto. Como o nome indica, código-fonte oficial de exemplo de firmware ST armazenado na pasta STM32F10x_StdPeriph_Examples, no processo de desenvolvimento futuro, você pode consultar para modificar este exemplo oficial para conduzir rapidamente seus próprios periféricos, muitos exemplos de placa de desenvolvimento referem-se ao código-fonte fornecido oficialmente das rotinas, esses códigos-fonte são muito importantes para o aprendizado futuro. O modelo de projeto está armazenado na pasta STM32F10x_StdPeriph_Template

Abaixo, enfocaremos vários arquivos importantes no diretório Bibliotecas. Os arquivos core_cm3.c e core_cm3.h estão localizados no diretório \ Libraries \ CMSIS \ CM3 \ CoreSupport. Este é o arquivo principal do CMSIS, que fornece acesso à interface principal do M3. Ele é fornecido pelo ARM e é o mesmo para todos Chips de núcleo CM3. Você nunca precisa modificar este arquivo.

Existem três arquivos neste diretório: arquivos system_stm32f10x.c, system_stm32f10x.he stm32f10x.h. A função de system_stm32f10x.c e do arquivo de cabeçalho correspondente system_stm32f10x.h é definir o relógio do sistema e do barramento. Há uma função SystemInit () muito importante, que será chamada quando nosso sistema começar a definir o sistema Todo o sistema de relógio.

Quatro, introdução da pasta SYSTEM

A pasta SYSTEM contém três pastas: delay, sys e usart. Inclui, respectivamente, delay.c, sys.c, usart.c e seus arquivos de cabeçalho delay.h, sys.h, usart.h.

4.1 Introdução ao código da pasta de atraso

A pasta de atraso contém dois arquivos, delay.c e delay.h, esses dois arquivos são usados ​​para implementar a função de atraso do sistema, que contém 3 funções

void delay_init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);

4.2 Introdução ao código da pasta sys

A pasta sys contém dois arquivos, sys.ce sys.h. Defina a definição da macro de leitura de entrada da porta IO STM32 e a definição da macro de saída em sys.h. Apenas uma função de grupo de interrupção é definida em sys.c

== Implementação da operação de bit da porta IO ==
Esta parte do código está no arquivo sys.h, que implementa a operação de bit de cada porta IO do STM32, incluindo leitura e saída. Claro, antes de chamar essas funções, você deve primeiro habilitar o relógio da porta IO e definir a função da porta IO. Esta parte apenas lê e controla a entrada e saída da porta IO.

Simplificando, a operação de banda de bits é expandir cada bit em uma palavra de 32 bits. Quando essas palavras são acessadas, o objetivo de acessar os bits é alcançado. Por exemplo, se o registro BSRR tem 32 bits, pode ser mapeados para 32 endereços. Acima, visitamos esses 32 endereços para atingir o objetivo de acessar 32 bits. Desta forma, podemos escrever 1 em um determinado endereço para atingir o objetivo de escrever 1 no bit correspondente, e também escrever 0 em um determinado endereço para alcançar o objetivo de escrever 0 no bit correspondente.
Insira a descrição da imagem aqui
Para a figura acima, escrevemos 1 no endereço Address0, então podemos atingir o objetivo de atribuir 1 ao Bit0 do registrador. Não queremos falar muito complicado aqui, porque a operação de banda de bits só pode ser usada para a entrada e saída da porta IO no desenvolvimento real. É mais conveniente e outras operações raramente são usadas no desenvolvimento diário. Vejamos a definição de operação de banda de bits em sys.h.

#define BITBAND(addr,bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)    *((volatile unsigned long    *)(addr)) 
#define BIT_ADDR(addr,bitnum)      MEM_ADDR(BITBAND(addr,bitnum)) //IO口地址映射
#define GPIOA_ODR_Addr        (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr        (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr        (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr        (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr        (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr        (GPIOF_BASE+12) //0x40011A0C       
#define GPIOG_ODR_Addr        (GPIOG_BASE+12) //0x40011E0C   
#define GPIOA_IDR_Addr        (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr        (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr        (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr        (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr        (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr        (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr        (GPIOG_BASE+8) //0x40011E08   //IO口操作,只对单一的IO口!//确保n的值小于16!
#define PAout(n)      BIT_ADDR(GPIOA_ODR_Addr,n)    //输出
#define PAin(n)        BIT_ADDR(GPIOA_IDR_Addr,n)    //输入
#define PBout(n)      BIT_ADDR(GPIOB_ODR_Addr,n)    //输出
#define PBin(n)        BIT_ADDR(GPIOB_IDR_Addr,n)    //输入
#define PCout(n)      BIT_ADDR(GPIOC_ODR_Addr,n)    //输出
#define PCin(n)        BIT_ADDR(GPIOC_IDR_Addr,n)    //输入
#define PDout(n)      BIT_ADDR(GPIOD_ODR_Addr,n)    //输出
#define PDin(n)        BIT_ADDR(GPIOD_IDR_Addr,n)    //输入
#define PEout(n)      BIT_ADDR(GPIOE_ODR_Addr,n)    //输出
#define PEin(n)        BIT_ADDR(GPIOE_IDR_Addr,n)    //输入
#define PFout(n)      BIT_ADDR(GPIOF_ODR_Addr,n)    //输出
#define PFin(n)        BIT_ADDR(GPIOF_IDR_Addr,n)    //输入
#define PGout(n)      BIT_ADDR(GPIOG_ODR_Addr,n)    //输出
#define PGin(n)        BIT_ADDR(GPIOG_IDR_Addr,n)    //输入

Com o código acima, podemos operar a porta IO do STM32 como 51 / AVR. Por exemplo, se eu quiser que a sétima porta IO de PORTA saia 1, posso usar PAout (6) = 1; Eu quero julgar se o 15º bit de PORTA é igual a 1, então posso usar if (PAin (14) == 1) ...; é isso.

4.3 Introdução à pasta usart

A pasta usart contém dois arquivos, usart.ce usart.h. Esses dois arquivos são usados ​​para inicialização da porta serial e recepção de interrupção. Isso é apenas para a porta serial 1. Por exemplo, se você deseja usar a porta serial 2 ou outras portas seriais, você só precisa modificar ligeiramente o código. Existem duas funções em usart.c, uma é void USART1_IRQHandler (void); a outra é void uart_init (u32 bound); há também um pedaço de código de suporte para a porta serial printf, se for removido, fará com que printf não pode ser utilizado, embora o software Compilation não reporte um erro, mas o STM32 não pode ser iniciado no hardware. Não modifique este código.

Acho que você gosta

Origin blog.csdn.net/weixin_44026026/article/details/113198053
Recomendado
Clasificación