比我我要操作PA0——PA8,我怎么才能一次操作这9个位而不影响PA9——PA15 的IO口!单片机我知道是P0=0x00,就是全部拉低,可是STM32 我试过用GPIOA->ODR=0x0000;可是这样也影响了高PA9——PA15,我就是想把PA0——PA8分离出来,并行操作,因为我要这九个位做并口做5*4键盘扫描程序!请高手帮忙解答,我用的是直接操作寄存器,我暂时不想学库函数操作,最好用直接操作寄存器的方法!谢谢了
方法二,怎么分离出其中九个IO口来实行并行操作呢?就是要51单片机那样直接P1=0x01这个样!
追答我们以GPIOA作为示范吧
将GPIOA0~GPIOA3作为行,GPIOA4~GPIOA8作为列。
其余的IO口只能作为输入功能 或 功能口(如上面说的ADC、UART、IIC、PWM、SPI、USB等)。
当要向行输出数据 value 时,将列配置为输入,行配置为输出,然后使用GPIOA->ODR = value。
当要向列输出数据 value 时,将行配置为输出,列配置为输入,然后使用GPIOA->ODR = value << 4;
这样操作也会影响其他位啊?还有GPIOA->ODR=value<<4;,那这个value不是1就是0 了,这样也只能给GPIOA的第四位GPIOA3输入高或低电平啊?那其他位怎么办啊?
追答ODR是什么意思呢?就是output data register, 即输出数据寄存器。
对ODR配置数据只会影响到功能是IO口而且必须是输出型的IO口。
GPIOA->ODR=value<<4;
为什么value不是1就是0呢?
vlaue的值可以是0x1F,也可以是0x03等等。
如果是0x03,即0B101,那就GPIOA4和GPIOA6将会设置为1,其它的输出口会被设置为0.
建议还是用库函数。
库函数是官方发布的,是经过大量验证的,极少出BUG,可减少自己一点点从底层寄存器架构时产生的系统性不好和出错。
使用库函数可减少大量的对底层的操作,能节约很多精力。与其一位一位的去数寄存器的位,不如把时间花在如何提高代码质量,以及学习更高级的编程思想,比如RTOS。这对于提高薪资收入有绝对的帮助。
现在绝大多数公司都是使用库函数的,而你只会使用底层寄存器的写法,会阻碍你和别人的对接,进一步的也会降低你进入先进公司的机会。
8位的单片机现在已经处于淘汰状态,前几日我看到ST公司发布会的介绍,STM32的出货量去年一年已经达到2亿片,32位处理器淘汰8位的已经是大势所趋。所以为了不让将来处于被动,应该积极的学习先进的知识和方法,而不是固步自封的让自己守在8位机编程那种,对寄存器一位一位的操作方式上。
除非你在写8位机这方面有很特殊的技艺,你可以留在8位机编程的思想上,否则还是按实际需要和主流方式来做事才是正道。因为做产品,时间成本是重大因素,官方适时推出了库函数的目的就在于缩短开发的时间和难度。除非你是做学术、做研究。
以下是我用库函数写的一个并口操作,单片机型号:STM32F1系列