STM32HAL库和STC51同时操作多个IO口

文章讲述了如何使用STM32的GPIO控制器函数HAL_GPIO_WritePin来同时拉低或拉高PC13、PC14和PC15引脚,并通过位操作进行代码优化,以及类似地展示了STC51对P3.5、P3.6和P3.7的控制方法。

STM32同时将PC13,PC14,PC15拉低/拉高。
根据:

#define GPIO_PIN_13                ((uint16_t)0x2000U)  /* Pin 13 selected   */
#define GPIO_PIN_14                ((uint16_t)0x4000U)  /* Pin 14 selected   */
#define GPIO_PIN_15                ((uint16_t)0x8000U)  /* Pin 15 selected   */
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  assert_param(IS_GPIO_PIN_ACTION(PinState));

  if(PinState != GPIO_PIN_RESET)
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin;
  }
  else
  {
    GPIOx->BRR = (uint32_t)GPIO_Pin;
  }
}

所以可以写成;

GPIOC -> BRR = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;//同时置零
GPIOC -> BSRR = GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15;//同时置一

优化一下:

GPIOC -> BRR = (0x2000 & 0x4000 & 0x8000) & ((7)<<13);  //7 = 4+2+1 相当于PC13,PC14,PC15 同时执行拉低。
GPIOC -> BSRR = (0x2000 & 0x4000 & 0x8000) & ((7)<<13);  //7 = 4+2+1 相当于PC13,PC14,PC15 同时执行拉高。

再次优化一下:

GPIOC -> BRR = 0xE000 & ((7)<<13);
GPIOC ->BSRR = 0xE000 & ((7)<<13);

STC51同时将P3.5,P3.6,P3.7拉低/拉高。

p3 &= (~0xe0); //将P3.5,P3.6,P3.7置零
p3 |= ((~7)<<5); //将P3.5,P3.6,P3.7置一
p3 |= ((~3)<<6); //将P3.6,P3.7置一
p3 |= (~255); //将P3口全部置一
### 关于STC32G12K128微控制器的HAL 对于STC32G12K128微控制器而言,其开发环境主要依赖于直接操作寄存器的方式来进行编程[^2]。然而,这并不意味着不存在类似于STM32 HAL的支持工具或资源。 #### 下载与安装 尽管官方并未提供专门针对STC32系列的标准HAL,开发者社区内存在第三方创建的相关支持包。这些支持包通常可以在GitHub或其他开源平台上找到。建议访问STC官方网站获取最新的固件更新驱动程序,并查阅论坛寻找可能存在的社区贡献版本。 #### 配置方法 由于缺乏官方提供的HAL,配置过程更地涉及到初始化外设寄存器设置。如果希望简化这一流程,可以考虑采用轻量级的封装层来模拟部分HAL功能。这类实现可以通过阅读其他MCU平台(如STM32)上的HAL文档获得灵感并自行构建适合STC32的应用框架。 ```c // 初始化GPIO引脚作为PWM输出的例子 void PWM_Init(void){ // 假定已经完成了必要的时钟使能其他前期准备 // 设置特定端模式为推挽输出 GPIOA->CRH &= ~(0xF << (4*PIN)); GPIOA->CRH |= (GPIO_CRH_MODE_PIN_5 | GPIO_CRH_CNF_PIN_5_1); // 启用定时器通道用于生成PWM信号... } ``` 此代码片段展示了如何手动配置GPIO以供PWM使用的情况下的基本思路。 #### 示例代码 考虑到实际应用需求,在这里给出一段简单的PWM控制LED亮度变化的小例子: ```c #include "stc32g.h" #define LED_PWM_CHANNEL TIM_Channel_1 #define LED_TIM TIM2 int main(){ SystemInit(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // GPIO初始化省略... TIM_DeInit(LED_TIM); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = 99; // 自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler = 71; // 定时器分频系数 TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(LED_TIM,&TIM_TimeBaseStructure); TIM_OCStructInit(&TIM_OCInitStructure); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OCInitStructure.TIM_Pulse = 49; // 初始占空比 TIM_OC1Init(LED_TIM,&TIM_OCInitStructure); TIM_Cmd(LED_TIM,ENABLE); while(1){ // 主循环体中可加入调整TIM_OCInitStructure.TIM_Pulse改变占空比逻辑 } } ``` 这段代码实现了利用定时器产生的PWM波形去调节连接到指定IO上的LED灯亮暗程度的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值