GPIOA高8位输入控制低8位输出(寄存器操作)

int main()
{
    GPIOA->CRH = 0x44444444;
    GPIOA->CRL = 0x33333333;
    while(1)
    {
        if((GPIOA->IDR & 0x0100) == 0x0100)
            GPIOA->BSRR = 0x01;
        else
            GPIOA->BRR = 0x01;

        if((GPIOA->IDR & 0x0200) == 0x0200)
            GPIOA->BSRR = 0x02;
        else
            GPIOA->BRR = 0x02;

        if((GPIOA->IDR & 0x0400) == 0x0400)
            GPIOA->BSRR = 0x04;
        else
            GPIOA->BRR = 0x04;

        if((GPIOA->IDR & 0x0800) == 0x0800)
            GPIOA->BSRR = 0x08;
        else
            GPIOA->BRR = 0x08;

        if((GPIOA->IDR & 0x1000) == 0x1000)
            GPIOA->BSRR = 0x10;
        else
            GPIOA->BRR = 0x10;

        if((GPIOA->IDR & 0x2000) == 0x2000)
            GPIOA->BSRR = 0x20;
        else
            GPIOA->BRR = 0x20;

        if((GPIOA->IDR & 0x4000) == 0x4000)
            GPIOA->BSRR = 0x40;
        else
            GPIOA->BRR = 0x40;

        if((GPIOA->IDR & 0x8000) == 0x8000)
            GPIOA->BSRR = 0x80;
        else
            GPIOA->BRR = 0x80;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32调试报告 1、头文件 初始化相应的函数,同时最好将相应的引脚进行宏定义,方便后面写主函数时方面。 2、 c函数 c函数要将相应的头文件包括进去,同时初始化相应头文件里面的自己定义的函数。对相应的函数进行编写,包括引入结构体,时钟初始化,选择相应的引脚、引脚输入输出模式、如果是输出需要设置输出速度。 3、 main函数 4、 GPIO端口七个寄存器 两个32位配置寄存器GPIO_CRL AND GPIO_CRH. TWO 32bit dateregister GPIO_IDR AND DPIO_ODR 一个32位置位/复位寄存器GPIO_BSRR 一个16位复位寄存器GPIO_BRR 一个32位锁存寄存器GPIO_LCKR GPIO_CRL寄存器的复位值为 0X4444 4444,从图 6.1.4 可以看到,复位值其实就是配置端口为浮空 输入模式。从上图还可以得出:STM32 的 CRL 控制着每组 IO 端口(A~G)的 8 位的模式。 每个 IO 端口的位占用 CRL 的 4 个位,两位为 CNF,两位为 MODE。这里我们可以记住几 个常用的配置,比如 0X0 表示模拟输入模式(ADC 用)、0X3 表示推挽输出模式(做输出口用, 50M 速率)、0X8 表示上/下拉输入模式(做输入口用)、0XB 表示复用输出(使用 IO 口的第二 功能,50M 速率)。 在固件库中操作 IDR 寄存器读取 IO 端口数据是通过 GPIO_ReadInputDataBit 函数实现的: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin) 比如我要读 GPIOA.5 的电平状态,那么方法是: GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5); 返回值是 1(Bit_SET)或者 0(Bit_RESET); 在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现 的: void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal); GPIO_WriteBit(GPIOR,GPIO_Pin_0,(BitAction)(1));//LED控制操作使用ODR AND IDP寄存器 在使用寄存器BSRR寄存器BRR时,使用规则总结如下: 1、置GPIOD->BSRR16位的某位为’1’,则对应的I/O端口置’1’;而置GPIOD->BSRR16位的某位为’0’,则对应的I/O端口不变。 2、置GPIOD->BSRR16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BSRR16位的某位为’0’,则对应的I/O端口不变。 3、置GPIOD->BRR16位的某位为’1’,则对应的I/O端口置’0’;而置GPIOD->BRR16位的某位为’0’,则对应的I/O端口不变。 使用场合举例如下: 1)要设置D0、D5、D10、D11为,而保持其它I/O口不变,只需一行语句: GPIOD->BSRR = 0x0C21;// 使用规则1 2)要设置D1、D3、D14、D15为,而保持其它I/O口不变,只需一行语句: GPIOD->BRR = 0xC00A;// 使用规则三 3)要同时设置D0、D5、D10、D11为,设置D1、D3、D14、D15为,而保持其它I/O口不变,也只需一行语句: GPIOD->BSRR = 0xC00A0C21;// 使用规则一和规则二 实例3 假设需要对 GPIOA_Pin_6 输出电平。采用改写 ODR 寄存器的方式时,使用“读-改-写”操作,代码如下: uint32_t temp; temp = GPIOA->ODR; temp = temp | GPIO_Pin_4; GPIOA->ODR = temp; 而使用改写 BSRR 寄存器时,仅需要使用如下语句: GPIOA->BSRR = GPIO_Pin_6; 在修改 ODR 时,为了确保对端口 6 的修改不会影响到其他端口的输出,需要对端口的原始数据进行保存,之后再对端口 6 的值进行修改,最后再写入寄存器(即读-改-写形式改变位的状态)。而对 BSRR操作,是写 1 有效,写 0 不改变原状态,因此可以对端口 6 置 1,其他位保持为 0。BSRR 为 1 的位,会修改相应的 ODR 位,从而控制输出电平。 因此,在设置单个 IO 口输出时,使用 BSRR 进行操作会更加方便。 在固件库中操作 IDR 寄存器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值