[CC2530 Introducción Tutorial-02] Control general de entrada y salida del puerto de E / S del CC2530

[CC2530 Introducción Tutorial-06] Principio de funcionamiento y aplicación del ADC de CC2530

[Tutorial de introducción CC2530-05] El principio y la aplicación de la interfaz serial de CC2530

[Curso de introducción CC2530-04] El principio y la aplicación del temporizador / contador CC2530

[CC2530 Curso de introducción-03] Sistema de interrupción CC2530 y aplicación de interrupción externa

[CC2530 Introducción Tutorial-02] Control general de entrada y salida del puerto de E / S del CC2530

[CC2530 Getting Started Tutorial-01] Conceptos básicos de introducción al desarrollo del microcontrolador CC2530


Uno, la descripción general de los pines de CC2530

        El microcontrolador CC2530 está empaquetado en QFN40 y tiene 40 pines. Entre ellos, hay 21 puertos de E / S digitales , entre los cuales P0 y P1 son puertos de 8 bits , y P2 tiene solo 5 bits disponibles. Estos 21 puertos pueden configurarse todos mediante programación . De hecho, de los 5 pines del puerto P2, 2 deben usarse para simulación y 2 deben usarse como oscilador de cristal.En realidad, solo puede usar 17 pines en el desarrollo de CC2530 .

        Dentro del microcontrolador, hay unidades de almacenamiento con funciones especiales. Estas unidades se utilizan para almacenar comandos, datos o alguna información de estado durante el funcionamiento de los dispositivos internos del microcontrolador. Estos registros se denominan colectivamente " registros de funciones especiales (SFR ). ". La esencia del funcionamiento de un microcontrolador es leer y escribir estos registros de funciones especiales, y algunos registros de funciones especiales pueden direccionarse por bits .

        Cada registro de función especial es esencialmente una unidad de memoria , y la dirección de memoria que identifica a cada unidad de memoria no es fácil de recordar. Para facilitar su uso, a cada registro de función especial se le asigna un nombre Al programar, siempre que se introduzca el archivo de encabezado " ioCC2530.h ", se puede acceder directamente a la dirección de memoria mediante el nombre del registro.

Hay 4 registros comunes relacionados con el puerto de E / S de propósito general de CC2530:

        <1>  PxSEL : Selección de función de puerto, para establecer si el puerto es de E / S general o función periférica .

        <2>  PxDIR : Como E / S general, se utiliza para establecer la dirección de transmisión de datos.

        <3>  PxINP : cuando se usa como un puerto de entrada de propósito general, seleccione si el modo de entrada es pull-up , pull-down o tri-state .

        <4>  Px : puerto de datos, utilizado para controlar la salida del puerto u obtener la entrada del puerto.

 

En segundo lugar, el método de establecer ciertos bits en el registro.

 <1> Borre algunos bits del registro a 0 sin afectar a otros bits.

        Por ejemplo: el valor actual del registro es P1TM 0x6C, ahora requiere el primer registro . 1 bit de . 3  , y la posición . 5 bit se establece en 0 , sin afectar los bits restantes del valor del registro, entonces, debe estar escrito en lenguaje C, ¿qué pasa con el código?

        Utilice " & = " para borrar el bit especificado del registro a 0 sin afectar el valor de otros bits.

        Escritura correcta: P1TM & = ~ 0x2A;

        Porque: la característica de la operación lógica "y" es que el bit tiene un 0 y el resultado es 0, si es 1, el valor original se mantiene sin cambios.

        El primer byte  0000 0000  en el bit a operar se establece en 1 , es decir, 00101010 , este valor en el invertido , es decir, 11010101 , es decir, ~ 0x2A . Luego "Y" el valor con el registro P1TM, luego los bits con 0, es decir, los bits 1, 3 y 5 se borrarán a 0, y los bits restantes mantendrán sus valores originales.

        Entonces: el valor actual de P1TM es 0x6c, que es 0110 1100,

        0110 1100  &&  1101 0101  =  0100 0100 , es decir, los bits 1, 3 y 5 se borran a 0 y los demás bits permanecen sin cambios.

        <Nota> : Este método solo puede funcionar cuando varios bits se borran a 0 al mismo tiempo, o un bit se borra a 0. Si el bit de registro debe borrarse a 0 y establecerse en 1, este método de escritura no se puede utilizar . (Piensa en las razones por ti mismo)

        En muchos programas de código fuente de aplicaciones integradas, la operación de limpieza para el enésimo bit del registro también se puede escribir como: registro & = ~ (0x01 << (n)); la razón es la misma.

<2> Establezca algunos bits del registro sin afectar a otros bits.

        Por ejemplo: el valor actual del registro es P1TM 0x6C, ahora es necesario registrar el primer bit 1 de . 4 , y la posición . 5 bit se establece en 1 , sin afectar a los otros bits del valor del registro, entonces, debería ser escrito en lenguaje C, ¿qué pasa con el código?

        Utilice " | = " para asignar el registro a 1 sin afectar el valor de otros bits.

        Escritura correcta: P1TM | = 0x32;

        Porque: la característica de la operación lógica "o" es que el bit tiene un 1 y el resultado es 1, y si es 0, el valor original se mantiene sin cambios.

        El primer byte  0000 0000  en el bit a operar se establece en 1 , es decir, 00110010 , es 0x32. Entonces "O" el valor con el registro P1TM, el bit con 1, es decir, los bits 1, 4 y 5 se establecerán en 1, y los bits restantes permanecerán sin cambios.

        Entonces: el valor actual de P1TM es 0x6c, que es 0110 1100,

        0110 1100 ||  0011 0010  =  0111 1110 , es decir, las posiciones 1, 4 y 5 son 1 y los demás bits permanecen sin cambios.

        También tenga en cuenta: este método solo puede funcionar cuando varios bits se establecen en 1 al mismo tiempo, o una determinada posición se establece en 1.

        La operación de borrado para el enésimo bit del registro también se puede escribir como: registro | = (0x01 << (n));

 

3. Caso de entrenamiento: entrada clave para controlar el estado de la salida de luz

[1] Preparativos.

Introduzca el archivo de encabezado necesario " ioCC2530.h " para CC2530 , defina las variables relacionadas, etc.

[2] Selección de función de puerto.

        La mayoría de los puertos de E / S del microcontrolador están multiplexados con funciones . Cuando está en uso, la función del puerto debe configurarse a través del registro de selección de función.

[3] Configuración de la dirección de transmisión del puerto.

[4] Configure el modo de entrada para el puerto de entrada.

        El modo de entrada se utiliza para obtener señales eléctricas de entrada de dispositivos externos. Cuando el pin de CC2530 es un puerto de entrada, el puerto puede proporcionar tres modos de entrada de "pull up", "pull down" y "three-state", que pueden ser configurado por programación. En esta capacitación, en realidad no es necesario configurar el modo de entrada de los pines P0_1 y P1_2, porque después de reiniciar el CC2530, cada puerto de E / S usa el modo pull-up por defecto.

[5] La idea básica de la configuración general del registro del puerto de E / S.

[6] Diseño de la función de inicialización del puerto InitPort ().

        <1> Configure el registro P1SEL y configure P1_2, P1_3 y P1_4 como puertos de E / S de uso general.

        <2> Configure el registro P1DIR , configure P1_3 y P1_4 como salida y configure P1_2 como entrada.

        <3> Configure el registro P0SEL y configure P0_1 como un puerto de E / S de propósito general.

        <4> Configure el registro P0DIR y configure P0_1 como entrada.

        <5> Configure el registro PxINP , configure P0_1 y P1_2 en modo pull-up, o no lo configure.

[7] Diseñe la función de escaneo del teclado ScanKeys ().

        <1> Cuando no hay ningún botón, la entrada del puerto es alta . Cuando se encuentra que el puerto tiene un nivel bajo , puede ser presionar un botón, que debe eliminarse . Si el puerto aún está bajo , Se confirma al presionar un botón.

        <2> Al realizar el procesamiento de la tecla, primero espere a que se suelte la tecla y luego realice el control invertido del estado del interruptor del LED correspondiente.

[8] La realización de la función principal.

En este punto, el trabajo está hecho, conéctese al emulador, compile y depure.

[Adjunto]: este código fuente de formación.

#include "ioCC2530.h"

#define LED5 P1_3
#define LED6 P1_4
#define SW1 P1_2
#define SW2 P0_1
/*===================延时函数=========================*/
void Delay(unsigned int t)
{
  while(t--);
}
/*================端口初始化函数======================*/
void InitPort()
{
  P1SEL &= ~0x18;         //将P1_3和P1_4设置为通用I/O端口功能
  P1DIR |= 0x18;          //将P1_3和P1_4的端口传输方式设置为输出
  P1SEL &= ~0x04;         //将P1_2设置为通用I/O端口功能
  P1DIR &= ~0x04;         //将P1_2的端口传输方式设置为输入
  P0SEL &= ~0x02;         //将P0_1设置为通用I/O端口功能
  P0DIR &= ~0x02;         //将P0_1的端口传输方式设置为输入
  P0INP &= ~0x02;         //将P0_1的端口输入方式设置为:上拉/下拉
  P1INP &= ~0x04;         //将P1_2的端口输入方式设置为:上拉/下拉
  P2INP &= ~0x60;         //将P0端口和P1端口引脚设置为:上拉
  LED5 = 0;               //上电的时候,LED5不亮
  LED6 = 0;               //上电的时候,LED6不亮
}
/*=================按键扫描函数=======================*/
void ScanKeys()
{
  if(SW1 == 0)
  {                       //发现SW1有低电平信号
    Delay(100);           //按键去抖动
    if(SW1 == 0)
    {                      //确实是有按键动作
      while(SW1 == 0);    //等待按键1松开
      //将LED5的灯光开关状态取反
      LED5 = ~LED5;
  }
  if(SW2 == 0)
  {                       //发现SW2有低电平信号
    Delay(100);           //按键去抖动
    if(SW2 == 0)
    {                     //确实是有按键动作
      while(SW2 == 0);    //等待按键2松开
      LED6 = ~LED6;
    }
  }
}
/*=====================主函数=========================*/
void main()
{
  InitPort();
  while(1)
  {
    ScanKeys();
  }
}

 

Supongo que te gusta

Origin blog.csdn.net/weixin_44643510/article/details/114315442
Recomendado
Clasificación