新手上路
- 积分
- 27
- 金钱
- 27
- 注册时间
- 2019-3-5
- 在线时间
- 10 小时
|
发表于 2019-4-4 15:54:18
|
显示全部楼层
新手,这个问题我也迷惑了好久,找了一个多小时,没有直接回答到点子上的,看了@douxiaolingyun的回复有点明白了,总结下:用ODR寄存器举例:
ODR寄存器低16位对应GPIOx的一组16个引脚,如图。
如果每个引脚都输出,则每一个二进制位都是“1”,也就是16个1:
11111111 11111111
这组二进制码转换成16进制就是:
FFFF
//GPIO头文件中的代码如下,是以16进制表示:
#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_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */ 00000000 00000001
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */ 00000000 00000010
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */ 00000000 00000100
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */ 00000000 00001000
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */ 00000000 00010000
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */ 00000000 00100000
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */ 00000000 01000000
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */ 00000000 10000000
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< Pin 8 selected */ 00000001 00000000
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< Pin 9 selected */ 00000010 00000000
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< Pin 10 selected */ 00000100 00000000
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< Pin 11 selected */ 00001000 00000000
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< Pin 12 selected */ 00010000 00000000
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< Pin 13 selected */ 00100000 00000000
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< Pin 14 selected */ 01000000 00000000
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< Pin 15 selected */ 10000000 00000000
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< All pins selected */ 11111111 11111111
可见2进制码中每一个“1”对应一个位,对应一个IO口。
所以“=0xFF”,就是使ODR寄存器的对应位变为00000000 11111111,也就是P0~P7脚输出,实现了一次输出多个引脚。
不知道总结的对不对。
|
|