|
1. Conectando os níveis superior e inferior Na aula anterior, nos familiarizamos com o processo básico do desenvolvimento do programa CC2430 pela IAR por meio de um experimento simples de piscas LED. A faca já foi afiada de qualquer forma (embora minha pedra de afiar não esteja boa), e agora vou começar a abater insetos :). A seguir, vamos aprender alguns experimentos básicos do CC2430. Cada pequeno experimento é dividido em três partes: "Introdução ao Experimento", "Diagrama de Fluxo do Programa" e "Código-Fonte e Análise Experimental". Este artigo explica interrupções externas. 2. Interrupção externa(1) Introdução ao experimentoInterrupções são um mecanismo interno para microcontroladores processarem eventos internos ou externos em tempo real. Quando ocorre um evento interno ou externo, o sistema de interrupções do microcontrolador força a CPU a pausar o programa em execução e, em vez disso, processar o evento de interrupção. As interrupções são divididas em externas e internas, e o CC2430 contém um total de 18 fontes de interrupção (para descrições específicas de interrupções e definições de vetores de interrupção, consulte "Manual de Chinês CC2430》)。 Agora vamos dar uma olhada no diagrama de circuito dessa placa de desenvolvimento:
O botão S1 foi conectado ao P0.1 na placa de desenvolvimento, e o efeito desse experimento é disparar a interrupção do P0.1 através do botão S1, e então controlar o ligar/desligar do LED1 no subprograma de serviço de interrupção. (2) Princípio experimental e fluxogramaO fluxograma experimental é o seguinte:
(3) Código-fonte experimental//头文件
#include
//延时子函数
#defineliderou1 P1_0
#defineLed2 P1_1
#defineLed3 P1_2
#defineliderou4 P1_3
vazioAtraso(sem assinaturan)
{
sem assinaturatt;
para(tt =0; TT<N; tt++);
para(tt =0; TT<N; tt++);
para(tt =0; TT<N; tt++);
para(tt =0; TT<N; tt++);
para(tt =0; TT<N; tt++);
}
//32M晶振初始化
vazioxtal_init(vazio)
{ SONO &= ~0x04; //都上电
enquanto(! (SONO &0x40)); //晶体振荡器开启且稳定 CLKCON &= ~0x47; //Escolha um oscilador de cristal de 32MHz SONO |=0x04;
}
//LED灯初始化
vazioled_init(vazio)
{ P1SEL =0x00; P1 é a porta normal de E/S P1DIR |=0x0F; Saída P1.0 P1.1 P1.2 P1.3
liderou1 = 0; liderou2 = 0; liderou3 = 0; liderou4 = 0;
}
//io及外部中断初始化
vazioio_init(vazio)
{ P0INP &= ~0X02; //P0.1有上拉、下拉
EA =1; //总中断使能
P0IE =1; //P0中断使能
PICTL |= 0X09; //P0.1口中断使能,下降沿触发
P0IFG &= ~0x02; //P0.1中断标志清0 };
//主函数
vaziomain(vazio)
{ xtal_init(); led_init(); io_init();
enquanto(1); //等待中断
}
//中断服务子程序
#pragma vetor = P0INT_VECTOR
__interrupt vazioP0_ISR(vazio)
{ EA =0; O portão é interrompido
Atraso(10000); Atraso(10000); Atraso(10000); Atraso(10000); Atraso(10000);
se((P0IFG &0x02) >0) //按键中断 { P0IFG &= ~0x02; //P0.1中断标志清0 liderou1 = !liderou1; } P0SE =0; //P0中断标志清0
EA =1; //开中断
}
Primeiro, inicialize o clock do sistema: selecione um oscilador de cristal de 32MHz. Depois, inicialize os LEDs: defina P1 como porta geral de E/S, defina a direção P1.0 ~ P1.3 como saída e então desligue as 4 luzes de LED. Em seguida, configure os registradores de SFR relevantes para interrupções externas para permitir interrupções em todos os níveis, envolvendo 3 SFRs:EA、IEN1、PICTL(Para detalhes de cada SFR, consulte oManual de Chinês CC2430》): EA- Interrupção total habilitada; IEN1.5- Ativação de interrupção P0; PICTL.3—— Ativação de interrupção de porta P0.1; PICTL.0—— Configure a borda de queda da entrada da porta P0.1 para causar disparo de interrupção. Depois, use while(1) na função principal e aguarde a interrupção. Dicas CC2430(1) Resumo da sintaxe de atribuição de bits Muitas vezes, precisamos atribuir um bit (0 ou 1) a um único byte de SFR para controlar com precisão o dispositivo de hardware. Existe a SFREndereçamento de bits de suportePor exemplo, TCON, P0, etc., neste momento, a atribuição de contrapontos é muito simples, basta consultar a definição de bits na seção SFR Bit Access do arquivo de cabeçalho ioCC2430.h: P0_0 = 0; // atribua 0 ao primeiro dígito de P0 P0_0 = 1; // atribuir um valor de 1 ao primeiro dígito de P0
Mas alguns SFRs não estão láEndereçamento de bits não é suportado, como neste experimentoPICTL, neste momento, você quer atribuir um valor a um deles, a sintaxe é a seguinte: PICTL &= ~0x01; Atribua um valor 0 ao primeiro dígito PICTL |= 0x01; Atribua um valor 1 ao primeiro dígito
Você pode lembrar&= ~,|=Essas duas sintaxe de atribuição de bits são comumente usadas. (2) Resumo da habilitação de interrupções Quando uma interrupção está envolvida no programa, ela deve ser ativada antes que a interrupção seja acionada. A hierarquia do sistema de habilitação de interrupções C51 é muito óbvia: Chefe de Interrupção: EAé o chefe, responsávelGeralAtivar Interrupções: EA = 1;
Cada líder de esquadrão interrompido: O próximo é para cada umPartes funcionais(como P0, timer 1, etc.), esses SFRs geralmente são endereçáveis por bits, e o nome geralmente contém IE (Interrupt Enable): P0IE = 1;
Cada membro da equipe foi interrompido: Esquadrão Mas como cada recurso também contém múltiplas interrupções, o último nível é para esteToda interrupçãoEsse tipo de SFR geralmente é sem bits e não endereçável, e geralmente contém IE (Interrupt Enable) ou IM (Interrupt Mask) no nome: PICTL |=0x01;
Não precisa fazer o SFR de interrupção automático, basta entender sua hierarquia e então dedicar um tempo para consultar o manual ou o arquivo de cabeçalho. (3) Interromper a escrita de programas O uso de interrupções em um programa geralmente inclui duas partes: a escrita do subprograma de serviço de interrupção e a abertura da habilitação de interrupções. A função de interrupção foi apresentada acima, e a seguir está uma breve introdução à escrita do subprograma de serviço de interrupção: Especifique primeiroVetor de quebra, que pode ser consultado na seção Vetores de Interrupção do arquivo de cabeçalho ioCC2430.h, com a seguinte sintaxe: #pragma vetor = vetor de interrupção
Depois, escreva o gerenciador de interrupções imediatamente em seguida, que está estruturado da seguinte forma: __interrupt nome da função void (void) { //开中断 //中断处理 //中断标志清0 //关中断 }
3. ConclusãoEste artigo apresenta o método de implementação de interrupções externas simples baseado no CC2430 e, após a base das interrupções, apresentaremos outro módulo muito importante - temporizadores. O CC2430 tem um total de 4 temporizadores, que podem ser divididos em três categorias: cronômetro 1, cronômetro 2, cronômetro 3/4 (3 e 4 basicamente têm o mesmo uso). </n; tt++); </n; tt++); </n; tt++); </n; tt++); </n; tt++);
|