关于stm32电平翻转的问题

我想对PA1发送指令翻转电平,正常的置1和置0都是正常的,输出都是3v左右和0v。代码如下
#define POWERA1_ON GPIOA->ODR |= (1<<1)
#define POWERA1_OFF GPIOA->ODR &= ~(1<<1)
但是利用异或进行操作,引脚输出是1.06v,并且再次发送指令翻转输出是没变化的,一样是1.06v。下面两条都试过。
#define POWERA1_TUN GPIOA->ODR ^= GPIO_Pin_1 或 #define POWERA1_TUN GPIOA->ODR ^= (1<<1)
初始化代码如下:
gpio_InitTypeDef.GPIO_Mode=GPIO_Mode_Out_PP;
gpio_InitTypeDef.GPIO_Pin=GPIO_Pin_1;
gpio_InitTypeDef.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&gpio_InitTypeDef);
主函数:

while(1)
    {
        switch(flag1)
        {
            case 1:
                POWERA1_TUN;//PA1翻转
                break;
            case 2:
                POWERA2_TUN;//PA2翻转
                break;
        }
    }

while 导致 电平一直反转,因此会输出PWM波,此时用电压表测得的电压是PWM等效电压,如果用示波器看的话就是PWM波
可以考虑将函数不放在while中

1、为了实现STM32F1的GPIO输出H/L控制,不能针对ODR寄存器,请参考GPIO库中的这个函数:
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal)

2、还有种更加简单的办法实现PAout(1)^=1的方法,那就是STM32的位带操作