A maior rede de estudos do Brasil

Grátis
256 pág.
Descobrindo o STM32

Pré-visualização | Página 12 de 47

pro-
jetos já que a biblioteca de firmware vai fazer uma checagem de parâmetros
extensiva. No evento de uma violação da declaração, o GDB pode ser usada
para examinar os parâmetros dessa rotina para determinar o ponto de falha.
#include <stm32f10x.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void Delay(uint32_t nTime);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable Peripheral Clocks
... (1) ...
// Configure Pins
... (2) ...
// Configure SysTick Timer
... (3) ...
while (1) {
static int ledval = 0;
// toggle led
... (4) ...
Delay(250); // wait 250ms
}
}
// Timer code
... (5) ...
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
/* Infinite loop */
/* Use GDB to find out why we're here */
while (1);
}
#endif
Figura 4.1: Blinking Lights
60 Revision: (None) ((None))
A STM32 VL Discovery Board tem um LED ligado ao pino I/O PC9.
[14] Ao configurar esse pino, o clock deve primeiro ser ativado para a GPIO
Port C com o seguinte comando de biblioteca (descrito em maiores detalhes
na Seção 4.1).
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE); // (1)
Após habilitar os clocks, é necessário configurar qualquer pino que será
utilizado. Nesse caso, um único pino (PC9) deve ser configurado como saída
(descrito com maiores detalhes na Seção 4.2).
/* (2) */
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
Quando essa configuração está completa, o pino pode ser setado ou
resetado com o seguinte código:
/* (4) */
GPIO_WriteBit(GPIOC, GPIO_Pin_9 , (ledval) ? Bit_SET : Bit_RESET);
ledval = 1 - ledval;
O Pisca-Led utiliza um “timer tick” para medir a passagem do tempo.
Embora esse timer tick utilize uma interrupção, nós não vamos discutir antes
do Capítulo 11, o uso nesse caso pode ser tratado simplesmente como um
padrão. O núcleo do Cortex-M3 usado no processador STM32 possui um
timer dedicado para essa função. O timer funciona como um múltiplo do clock
do sistema (que é definido em ticks/second) – aqui nos configuraremos para
interrupções de 1ms ( a constante SystemCoreClock é definida na biblioteca
de firmware para ser o numero de ciclos de clock do sistema por segundo):
/* (3) */
if (SysTick_Config(SystemCoreClock / 1000))
while (1);
A cada 1ms, o timer aciona o gatilho para chamar o SysTick_Handler.
Para a demonstração do “blinking light”, nós simplesmente decrementaremos
um contador comum – declarado como __IO para garantir que o compilador
não faça uma otimização indesejada.
Revision: (None) ((None)) 61
CAPÍTULO 4. CONFIGURAÇÃO DO STM32
/* (5) */
static __IO uint32_t TimingDelay;
void Delay(uint32_t nTime){
TimingDelay = nTime;
while(TimingDelay != 0);
}
void SysTick_Handler(void){
if (TimingDelay != 0x00)
TimingDelay --;
}
Esse programa simples de “blinking light” requer suporte de dois módu-
los de biblioteca (stm32_gpio.c e stm32_rcc.c). Para incluir isso no projeto,
nós temos que modificar levemente o MakeFile fornecido com o projeto demo.
TEMPLATEROOT = ../../stm32vl_template
# additional compilation flags
CFLAGS += -O0 -g
ASFLAGS += -g
# project files
OBJS= $(STARTUP) main.o
OBJS+= stm32f10x_gpio.o stm32f10x_rcc.o
# include common make file
include $(TEMPLATEROOT)/Makefile.common
No restante desse capítulo nós examinaremos as configurações de clock
e de pinos com maiores detalhes.
Exercise 4.1 Blinking Lights
Complete o programa main.c do “Blinking Light” e crie um projeto
usando o programa de demonstração descrito no Capítulo 3 como um exemplo.
Você deverá compilar e rodar o seu programa.
Modifique seu programa para causar uma violação de declaração (as-
sertion violation) – por exemplo troque GPIOC com 66 quando inicializar o
pino -– e use o GDB para achar o local na biblioteca de código fonte onde
houve a falha de assertion.
62 Revision: (None) ((None))
4.1. DISTRIBUIÇÃO DE CLOCK
4.1 Distribuição de Clock
No mundo dos processadores embarcados, o consumo de energia é muito
importante; assim, a maioria dos processadores embarcados sofisticados pos-
suem mecanismos para desligar quaisquer recursos que não sejam necessá-
rios para uma aplicação particular. O STM32 tem uma rede de distribuição
de clock complexa que garante que somente os periféricos que são utilizados
na aplicação serão ligados. Esse sistema, chamado Reset and Clock Con-
trol (RCC) é controlado pelo módulo de firmware stm32f10x_rcc.[ch]. En-
quanto esse módulo pode ser usado para controlar o clock principal do sistema
e PLLs, qualquer configuração necessária por eles é tratada pelo código de ini-
cialização fornecido com os exemplos nesse livro. Nossa preocupação aqui é
simplesmente como habilitar o clock dos periféricos.
Os periféricos do STM32 são organizados em três grupos diferentes
chamados APB1, APB2, e AHB. Periféricos APB1 incluem os dispositivos
I2C, USARTs 2-5, e dispositivos SPI; dispositivos APB2 incluem as portas
GPIO, controladores ADC e a USART1. Dispositivos AHB são primariamente
orientados a memória incluindo os controladores DMA e interfaces de memória
externa (para alguns dispositivos).
Para diversos periféricos o clock pode ser controlado com três rotinas
de firmware:
RCC_APB1PeriphClockCmd(uint32_t RCC_APB1PERIPH ,
FunctionalState NewState)
RCC_APB2PeriphClockCmd(uint32_t RCC_APB2PERIPH ,
FunctionalState NewState)
RCC_AHBPeriphClockCmduint32_t RCC_AHBPERIPH ,
FunctionalState NewState)
Cada rotina recebe dois parâmetros – um vetor de bits do periférico
a qual o estado será modificado, e uma ação – ENABLE ou DISABLE. Por
exemplo, as portas do GPIO A e B podem ser habilitadas com o seguinte
chamado:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB , ENABLE);
As constantes apropriadas são definidas em stm32f10x_rcc.h; o nome
das constantes, mostradas na Tabela 4.1, são relativamente auto-explicativas
e correspondem aos nomes dos dispositivos utilizados em vários manuais de
referência do STM32 ([20, 21]), limitado a aqueles que estão presentes na MCU
Revision: (None) ((None)) 63
CAPÍTULO 4. CONFIGURAÇÃO DO STM32
STM32 Discovery Board. Isto é um testemunho de que o projeto da família
STM32 tem as mesmas constantes e bibliotecas principais que se aplicam
através de uma ampla família de dispositivos. (Observe que os componentes
stm32f2xx e stm32f4xx tem semelhanças e diferenças na biblioteca padrão de
periféricos).
APB1 Devices APB2 Devices
RCC_APB1Periph_BKP RCC_APB2Periph_ADC1
RCC_APB1Periph_CEC RCC_APB2Periph_AFIO
RCC_APB1Periph_DAC RCC_APB2Periph_GPIOA
RCC_APB1Periph_I2C1 RCC_APB2Periph_GPIOB
RCC_APB1Periph_I2C2 RCC_APB2Periph_GPIOC
RCC_APB1Periph_PWR RCC_APB2Periph_GPIOD
RCC_APB1Periph_SPI2 RCC_APB2Periph_GPIOE
RCC_APB1Periph_TIM2 RCC_APB2Periph_SPI1
RCC_APB1Periph_TIM3 RCC_APB2Periph_TIM1
RCC_APB1Periph_TIM4 RCC_APB2Periph_TIM15
RCC_APB1Periph_TIM5 RCC_APB2Periph_TIM16
RCC_APB1Periph_TIM6 RCC_APB2Periph_TIM17
RCC_APB1Periph_TIM7 RCC_APB2Periph_USART1
RCC_APB1Periph_USART2
RCC_APB1Periph_USART3
RCC_APB1Periph_WWDG
AHB Devices
RCC_AHBPeriph_CRC RCC_AHBPeriph_DMA
Tabela 4.1: Clock Distribution Constant Names (stm32f10x_rcc.h)
Os códigos da biblioteca padrão de periféricos para habilitar clocks não
faz nenhuma “magica”, mas sim libera o programador da necessidade de ser
íntimo com os registradores do microcontrolador. Por exemplo, os periféricos
APB2 são habilitados através de um único registrador (RCC_APB2ENR)
(mostrador na Figura 4.2). 1; cada periférico é habilitado, ou desabilitado,
pelo estado de um único bit. Por exemplo, Bit 2 determina quando o GPIOA
está habilitado (1) ou desabilitado (0). Aplicando a estrutura e definições de
registrador em <stm32f10x.h> nós podemos habilitar

Crie agora seu perfil grátis para visualizar sem restrições.