CW32

Cortex-M0+处理器中内置有一个SysTick定时器,通常用于嵌入式操作系统的多任务切换,在不使用操作系统的应用中,亦可作为其它用途,如定时、计时或者为需要周期性执行的任务提供中断源。

1.SysTick工作原理

SysTick定时器内部含有一个24位的递减计数器,当计数减至0时,会从SysTick的重装载寄存器中取值作为计数器的初始值,同时可以选择在这个时候产生中断(异常号:15)。例如设置重装载寄存器为100,那么当计数减为0时,就会重新复位为100继续递减计数。

它的特点是: 

• 24 位递减计数器 

• 自动重装载能力 

• 当计数器达到 0 时产生可屏蔽的系统中断

2.SysTick寄存器介绍

在core_cm0plus.h中展示了四种寄存器,我们将一一介绍:

typedef struct
{
     __IOM uint32_t CTRL;                   
    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
    __IOM uint32_t LOAD;                   
    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */

    __IOM uint32_t VAL;                    
    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */
    __IM  uint32_t CALIB;                 
    /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */
} SysTick_Type;

IOM uint32_t CTRL控制寄存器:

第0位:ENABLE,SysTick使能位(0:关闭SysTick功能,1:开启SysTick功能);

第1位:TICKINT,SysTick中断使能位(0:关闭SysTick中断,1:开启SysTick中断);

第2位:CLKSOURCE,SysTick时钟选择(1:使用HCLK,0:使用参考时钟频率);

第3为:COUNTFLAG,SysTick计数比较标志,如果在上次读取本寄存器后,SysTick已经数到0了,则该位为1,如果读取该位,该位自动清零。

__IOM uint32_t LOAD重载寄存器:

24位的寄存器,最大计数0xFFFFFF。当SysTick计数器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。

__IOM uint32_t VAL当前值寄存器:

24位的寄存器,读取时返回当前计数器的计数值,写任何值都会使之清零,同时还会清除SysTick 控制寄存器中的COUNTFLAG 标志。

__IM  uint32_t CALIB校准值寄存器:

只读寄存器,主要存放10mS校准值,该值和MCU相关。

3.操控SysTick定时器

在MDK开发环境中,我们不必要非得去操作每一个寄存器,可以通过调用CW函数库中的函数来进行相关的操作。

void InitTick(uint32_t HclkFreq)

初始化SysTick滴答定时器,带入的参数为HCLK的频率,如HCLK为24MHz,则带入参数为24000000。该函数会调用uint32_t SysTick_Config(uint32_t ticks)函数完成SysTick定时器的相关配置并启动。SysTick默认为1mS定时器,如果需要修改定时周期,则需要修改uint32_t SysTick_Config(uint32_t ticks)函数中重装载值寄存器配置。

__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)   

初始化系统计时器及其中断,并启动。     

(1) SysTick->LOAD  = (uint32_t)(ticks - 1UL);  

设置SysTick重装载值

(2)NVIC_SetPriority(SysTick_IRQn, 

(1UL << __NVIC_PRIO_BITS) - 1UL);                        

设置SysTick定时器中断优先级

(3) Tick->VAL = 0UL;                          

加载SysTick计数器值

(4) SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

                   SysTick_CTRL_TICKINT_Msk   |

                   SysTick_CTRL_ENABLE_Msk;     

设置SysTick IRQ中断使能,并开启SysTick定时器

4.Systick延时功能实现

对于mS级及以上的延时,可在完成SysTick定时器初始化后,通过SysTickDelay(uint32_t Delay)函数来实现,该函数的形参为需要延时的mS数。

对于uS级延时,一般通过调整__NOP 空指令数量来实现,不建议用SysTick定时器来实现,主要原因是M0+系统中固有的中断响应时间(压栈和出栈)、中断处理时间等会影响uS延时精度。

int main(void)
{ 
    __RCC_GPIOC_CLK_ENABLE();   	//设置HCLK为24MHz
    InitTick( 24000000 );         		//初始化SysTick为1mS定时器
    GPIO_InitTypeDef  GPIO_InitStructure1 = {0} ;  //初始化对应GPIO口
    GPIO_InitStructure1.Pins = GPIO_PIN_3 ;		
    GPIO_InitStructure1.IT = GPIO_IT_NONE;
    GPIO_InitStructure1.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init(CW_GPIOC, &GPIO_InitStructure1);
    PC03_SETHIGH();   // LED灯置高电平,低电平有效
    while(1)
    {
    PC03_TOG(); //PC03口电平反转
    SysTickDelay (100);//延时100mS
    PC03_TOG();//PC03口电平再次反转
    SysTickDelay (100);//延时100mS 
    }
}

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 54

CW32系列芯片支持3种工作模式,运行模式、休眠模式以及深度休眠模式,本文以CW32L083为例介绍低功耗模式的特性。MCU上电以后,系统自动进入运行模式,可以通过软件配置,进入休眠或者深度休眠两种低功耗模式,进入低功耗运行状态后,可以通过外设中断触发唤醒机制,使得系统返回到运行模式,三种工作模式的转换机制如下图所示:

1.png

三种模式下CPU、时钟及外设状态:

• 运行模式(Active mode) 

运行模式下 CPU 正常运行,所有模块用户均可正常使用。

• 休眠模式(Sleep mode) 

休眠模式下,CPU 停止运行,所有外设不受影响,所有I/O引脚保持状态不变。

• 深度休眠模式(DeepSleep mode) 

深度休眠模式下,CPU停止运行,高速时钟(HSE、HSIOSC)自动关闭,低速时钟(LSE、 LSI、RC10K、RC150K)保持原状态不变。深度休眠模式的功耗远小于休眠模式。

CW32L083可以使用等待中断专用指令,WFI(Wait for Interrupt),配合系统控制寄存器(SCR, System Control Register)的SLEEPONEXIT和SLEEPDEEP位域,可实现立即进入或退出(中断服务程序)时进入休眠模式或深度休眠模式。

• 立即进入 

执行WFI指令,MCU将立即进入休眠模式(SLEEPDEEP为0时)或深度休眠模式(SLEEPDEEP为1时) 

• 退出时进入 

将SLEEPONEXIT位置1,当退出最低优先级的中断服务程序后,MCU会进入休眠模式(SLEEPDEEP为0时)或深度休眠模式(SLEEPDEEP为 1时),而不需执行WFI指令 。

2.png

注:在深度休眠模式下,系统将自动关闭高速时钟,如果需要在深度休眠模式下使部分外设仍保持运行,则需要在进入深度休眠模式前,启动相应的低速时钟并将该外设时钟设置为此低速时钟。

在休眠模式或深度休眠模式下,均可通过中断来唤醒CPU,返回到运行模式。如果用户在中断服务程序中执行WFI命令进入休眠(包括深度休眠),则需要比此中断更高优先级的中断才能唤醒CPU,因此,强烈建议在准备进入休眠前,应先处理完所有中断服务程序,并且清除所有中断请求和中断标志,以下是配置进入低功耗模式时所需注意的事项。

• 建议在进入低功耗模式前加一段时间的延迟,以免出现上电就进入低功耗模式,无法烧录程序。

• 系统可以配置从Deepsleep唤醒后,系统时钟来源是HSI还是进入休眠前的时钟。

• 系统进入低功耗模式,端口状态不会发生改变,此时需要客户根据实际应用来配置端口状态来达到理想的功耗值,未用端口建议配置为模拟模式。

• 其他的RTC等低功耗运行模块因在深度休眠下高速时钟停止运行,所以如果需要在深度休眠模式下运行RTC等模块,需配置模块时钟源为LSI或LSE。

根据上述内容,可以配置CW32L083的低功耗应用的例程,具体的代码可以查看CW32L083的固件库中PWR_CurrentConsumption这一例程,配置PA04和PA05为引脚输入,并开启下降沿中断,在中断服务函数改变gKeyStatus的值,从而使得MCU在main中进入低功耗休眠模式。

volatile uint8_t gKeyStatus;  
volatile uint32_t gFlagWakeUpIrq = 0;  
int main(void)
{

   RCC_HSI_Enable( RCC_HSIOSC_DIV6); //配置系统时钟为HSI 8M
   InitTick(8000000ul); //初始化SysTick
   LED_Init();         //LED初始化
   BSP_PB_Init();  //按键初始化
   while (1)
   {
      gKeyStatus = 0;//在没有进入低功耗模式前,PC03每间隔1s翻转一次状态
      do
      {
     PC03_TOG();         //翻转LED1
      SysTickDelay(1000);   //延迟1s.
      } while (gKeyStatus == 0);       
      PC03_SETLOW();         //PC03置低
      DeepSleepModeTest();    //进入深度睡眠模式
    }
}

//按键初始化,设置PA05沿下降沿触发中断
void BSP_PB_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    //打开GPIOA时钟
    REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOA_Msk);
    GPIO_InitStructure.Pins = GPIO_PIN_5;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT_PULLUP;
    GPIO_InitStructure.IT = GPIO_IT_FALLING;
    GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
    GPIO_ConfigFilter(CW_GPIOA, GPIO_PIN_5, GPIO_FLTCLK_RC10K);
    //设置GPIOA的中断等级为3
    NVIC_SetPriority(GPIOA_IRQn, 0x03);
    GPIOA_INTFLAG_CLR(GPIOx_ICR_PIN5_Msk );
    NVIC_EnableIRQ(GPIOA_IRQn);
}

//LED I/O初始化
void LED_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    //打开GPIO时钟
    REGBITS_SET(CW_SYSCTRL->AHBEN, SYSCTRL_AHBEN_GPIOC_Msk);
    GPIO_InitStructure.Pins = GPIO_PIN_2 | GPIO_PIN_3;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
    PC03_SETLOW();
}

void DeepSleepModeTest(void)
{
  GPIO_InitTypeDef GPIO_InitStructure = { 0 };
  PWR_InitTypeDef PWR_InitStructure = { 0 };
  
  //打开GPIO时钟
  REGBITS_SET(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk|\
  SYSCTRL_AHBEN_GPIOB_Msk | \
  SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);
  
  GPIO_InitStructure.Mode = GPIO_MODE_ANALOG;
  GPIO_InitStructure.IT = GPIO_IT_NONE;
  GPIO_InitStructure.Pins = GPIO_PIN_All;
  GPIO_Init(CW_GPIOA, &GPIO_InitStructure);
  GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
  GPIO_Init(CW_GPIOC, &GPIO_InitStructure);
  GPIO_Init(CW_GPIOF, &GPIO_InitStructure);  
  //关闭GPIO时钟
  REGBITS_CLR(CW_SYSCTRL->AHBEN,SYSCTRL_AHBEN_GPIOA_Msk| \
  SYSCTRL_AHBEN_GPIOB_Msk | \
  SYSCTRL_AHBEN_GPIOC_Msk | SYSCTRL_AHBEN_GPIOF_Msk);
  BSP_PB_Init();             //按键初始化
  // 唤醒后自动使用内部高速时钟(HSI)
  RCC_WAKEUPCLK_Config(RCC_SYSCTRL_WAKEUPCLKEN);
  PWR_InitStructure.PWR_Sevonpend = PWR_Sevonpend_Disable;
  PWR_InitStructure.PWR_SleepDeep = PWR_SleepDeep_Enable;
  PWR_InitStructure.PWR_SleepOnExit = PWR_SleepOnExit_Disable;
  PWR_Config(&PWR_InitStructure);
  PWR_GotoLpmMode();
  SYSCLKConfig_DeepSleep();
  LED_Init();
  SysTickDelay(200);
  PC02_SETHIGH();
  }
}
//GPIOA中断服务函数
void GPIOA_IRQHandler(void)
{
 if(REGBITS_GET(CW_GPIOA->ISR, GPIOx_ISR_PIN5_Msk) > 0)
    {
        gKeyStatus = 1;
        GPIOA_INTFLAG_CLR(GPIOx_ICR_PIN5_Msk);//清除CW_GPIO中断标志
    }
}

上述代码可以看到在未进入低功耗模式之前,LED1每1s翻转一次,通过按键KEY2进入低功耗模式后,LED1灯灭,当再次按下KEY2后,重新回到正常的运行模式,LED1每一秒翻转一次。通过测量可以得到,进入到低功耗模式之后,功耗显著降低。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 26

GPIO的意思是通用输入输出端口,可通过软件配置成输入或者输出端。即可以通过GPIO口输出高低电平或者通过GPIO口读入引脚状态是高电平还是低电平。大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚。如UART外设与其他硬件进行数据交互。

CW32L083的每组GPIO都有20个寄存器,除了基础的配置寄存器、数据寄存器、位置位/清零寄存器、位清零寄存器、锁定寄存器、复用功能寄存器外,还配置了位翻转寄存器,中断数字滤波寄存器等,让操作更加快捷。同时提供完善的固件库函数,方便工程师快速开发测试,增强可移植性。

GPIO端口可配置成8种工作模式

4种输入模式

1.浮空输入

2.输入上拉

3.输入下拉

4.模拟输入

4种输出模式

1.开漏输出

2.推挽式输出

3.开漏复用功能

4.推挽式复用功能

GPIO功能框图

1.png

初始化GPIO可使用void GPIO_Init(GPIO_TypeDef  *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,此函数在cw32l083_gpio.c中有详细的配置,其中的第一个参数GPIO_TypeDef是一个结构体类型,在cw32l083.h中有详细定义,包含着每组GPIO的20个寄存器。

typedef struct {写法DIR_f;              //输入输出方向寄存器OPENDRAIN_f;       //输出模式寄存器PDR_f;              //下拉电阻寄存器PUR_f;              //上拉电阻寄存器AFRH_f;             //复用功能寄存器高段AFRL_f;              //复用功能寄存器低段ANALOG_f;           //模拟数字配置寄存器RISEIE_f;             //上升沿中断使能寄存器FALLIE_f;             //下降沿中断使能寄存器HIGHIE_f;             //高电平中断使能寄存器LOWIE_f;             //低电平中断使能寄存器ISR_f;                //中断标志寄存器ICR_f;                //中断标志清除寄存器LCKR_f;               //配置锁定寄存器FILTER_f;              //中断数字滤波器配置寄存器IDR_f;                //输入数据寄存器ODR_f;               //输出数据寄存器BRR_f;               //位清零寄存器BSRR_f;              //位置位清零寄存器TOG_f;               //位翻转寄存器} GPIO_TypeDef;

第二个参数GPIO_InitTypeDef也是一个结构体,在cw32l083_gpio.h中可查看其定义。

typedef struct{       uint32_t Pins;       uint32_t Mode;       uint32_t IT;} GPIO_InitTypeDef;

下面举一个简单的例子配置一个IO口翻转,可实现闪灯实验。

int32_t main(void)

{

    GPIO_InitTypeDef GPIO_InitStruct = {0};


    RCC_HSI_Enable(RCC_HSIOSC_DIV6);  

    __RCC_GPIOC_CLK_ENABLE();        //打开GPIOC的时钟


    GPIO_InitStruct.IT = GPIO_IT_NONE;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pins = GPIO_PIN_2|GPIO_PIN_3;


    GPIO_Init(CW_GPIOC, &GPIO_InitStruct);


    while (1)

    {

        GPIO_TogglePin(CW_GPIOC,GPIO_PIN_2|GPIO_PIN_3);

        Delay(0xFFFF);  //延迟函数

    }

}

void Delay(__IO uint16_t nCount)

{

    /* Decrement nCount value */

    while (nCount != 0)

    {

        nCount--;

    }

}

例程中使用PC02和PC03引脚进行IO口翻转实验,官方CW32L083VCT6的评估板上这两个引脚外接LED灯,可以看到LED周期闪烁的效果。

其中CW_GPIOC,GPIO_PIN_0以及GPIO_MODE_OUTPUT_PP都是定义在头文件中的宏定义,如下面第一行为CW_GPIOC端口地址映射。

#define CW_GPIOC        ((GPIO_TypeDef*)       GPIOC_BASE)

#define GPIOC_BASE       0x48000800UL


#define GPIO_PIN_0       ((uint16_t)0x0001)   /* Pin 0    selected    */

#define GPIO_PIN_1       ((uint16_t)0x0002)   /* Pin 1    selected    */

#define GPIO_PIN_2       ((uint16_t)0x0004)   /* Pin 2    selected    */

#define GPIO_PIN_3       ((uint16_t)0x0008)   /* Pin 3    selected    */

#define GPIO_PIN_4       ((uint16_t)0x0010)   /* Pin 4    selected    */

#define GPIO_PIN_5       ((uint16_t)0x0020)   /* Pin 5    selected    */

#define GPIO_PIN_6       ((uint16_t)0x0040)   /* Pin 6    selected    */

#define GPIO_PIN_7       ((uint16_t)0x0080)   /* Pin 7    selected    */

#define GPIO_PIN_8       ((uint16_t)0x0100)   /* Pin 8    selected    */

#define GPIO_PIN_9       ((uint16_t)0x0200)   /* Pin 9    selected    */

#define GPIO_PIN_10      ((uint16_t)0x0400)   /* Pin 10   selected    */

#define GPIO_PIN_11      ((uint16_t)0x0800)   /* Pin 11   selected    */

#define GPIO_PIN_12      ((uint16_t)0x1000)   /* Pin 12   selected    */

#define GPIO_PIN_13      ((uint16_t)0x2000)   /* Pin 13   selected    */

#define GPIO_PIN_14      ((uint16_t)0x4000)   /* Pin 14   selected    */

#define GPIO_PIN_15      ((uint16_t)0x8000)   /* Pin 15   selected    */

#define GPIO_PIN_All      ((uint16_t)0xFFFF)   /* All pins selected    */


#define GPIO_MODE_ANALOG                    (0X00)

#define GPIO_MODE_INPUT                      (0x10)

#define GPIO_MODE_INPUT_PULLUP               (0x11)

#define GPIO_MODE_INPUT_PULLDOWN            (0x12)

#define GPIO_MODE_OUTPUT_PP                  (0x20)

#define GPIO_MODE_OUTPUT_OD                 (0x21)

上面的例子是使用库函数配置的,也可以用寄存器操作,具体步骤如下。

//开启HSI并6分频,Sysclk=HCLK=PCLK=8MHz

CW_SYSCTRL->HSI=(5<<SYSCTRL_HSI_DIV_Pos)|(*((volatile uint16_t*) RCC_HSI_TRIMCODEADDR));        

CW_SYSCTRL->CR1|=SYSCTRL_BYPASS|SYSCTRL_CR1_HSIEN_Msk; //Enable HSI             

while ((CW_SYSCTRL->HSI & SYSCTRL_HSI_STABLE_Msk) != SYSCTRL_HSI_STABLE_Msk) //Wait stable

    {

        ;

    }

//开启GPIOC的时钟

REGBITS_SET(CW_SYSCTRL->AHBEN, RCC_AHB_PERIPH_GPIOC);


//配置PC02和PC03为数字功能推挽输出

CW_GPIOC->ANALOG_f.PIN2  = 0;           //将PC02设置为数字功能

CW_GPIOC->DIR_f.PIN2  = 0;               //将PC02设置成输出模式

CW_GPIOC->OPENDRAIN_f.PIN2  = 0;        //将PC02设置成推挽模式

CW_GPIOC->ANALOG_f.PIN3  = 0;           //将PC03设置为数字功能

CW_GPIOC->DIR_f.PIN3  = 0;               //将PC03设置为输出模式

CW_GPIOC->OPENDRAIN_f.PIN3  = 0;        //将PC03设置为推挽模式

while (1)

   {

       CW_GPIOC->TOG=bv2;              //PC02翻转

       Delay(0xFFFF);

    CW_GPIOC->TOG=bv3;              //PC03翻转

       Delay(0xFFFF);

   }

下面以CW32L083为例通过配置GPIO引脚来驱动SPI2外设,查阅CW32L083的用户手册可以得知, SPI2可以通过PA00,PA01,PA02,PA03复用实现,这个就是上文提到的GPIO口的复用功能。

PA00_AFx_SPI2MISO()  //将PA00复用成SPI2的MISO线

PA01_AFx_SPI2MOSI()  //将PA01复用成SPI2的MOSI线

PA02_AFx_SPI2SCK()   //将PA02复用成SPI2的时钟线

PA03_AFx_SPI2CS()    //将PA03复用成SPI2的片选线,如需操作片选线,有特定函数


GPIO_InitTypeDef GPIO_InitStructure = {0};

GPIO_InitStructure.Pins =GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStructure.IT= GPIO_IT_NONE;

GPIO_Init(CW_GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.Pins =GPIO_PIN_0;

GPIO_InitStructure.Mode = GPIO_MODE_INPUT;

GPIO_Init(CW_GPIOA, &GPIO_InitStructure);

另外我们的GPIO支持外部中断,具体的配置如下,如果有不清楚的小伙伴可以查看下节CW32中断控制器,会有详细讲解。

GPIO_InitTypeDef GPIO_InitStruct = {0};


__RCC_GPIOA_CLK_ENABLE();//开启GPIOA的时钟


GPIO_InitStruct.IT = GPIO_IT_RISING | GPIO_IT_FALLING;  //上升沿或者下降沿触发

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pins =GPIO_PIN_1;


GPIO_Init(CW_GPIOA, &GPIO_InitStruct);


//清除PA01中断标志并使能NVIC

GPIOA_INTFLAG_CLR(bv1);

NVIC_EnableIRQ(GPIOA_IRQn);

上面的例程即可实现外部输入中断,PA01在接收到上升沿或者下降沿的信号的时候会进入到中断函数中去执行相关的程序,具体的例程可以参考官方CW32L083的gpio_int_filter例子。

下面介绍的是CW32L083的GPIO所相关的函数及其功能。

1.void GPIO_SWD2GPIO(void);

将PA13/PA14 SWD设置成GPIO


2.void GPIO_GPIO2SWD(void);

将PA13/PA14设置成SWD


3.void GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);

锁定指定引脚配置项,可同时设置多个引脚


4.void GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pins);

GPIO去初始化,可同时设置多个引脚或单个引脚


5.void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

GPIO 初始化,可同时设置多个引脚或单个引脚


6.void GPIO_ConfigFilter(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, uint32_t FltClk);

配置端口滤波


7.void GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState);

设置指定引脚电平,可同时设置多个引脚


8.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t Value);

设置指定引脚端口的输出值


9.void GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);

翻转指定引脚电平,可同时设置多个引脚


10.GPIO_PinState GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

获取一个引脚的电平

以上是CW32通用输入输出端口的介绍。

来源:武汉芯源半导体

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 16

页面

订阅 RSS - CW32