|
发表于 2023-12-8 13:12:28
|
显示全部楼层
本帖最后由 abbey_tom 于 2023-12-8 13:14 编辑
/*TT所用的AVR单片机与STM32在端口控制上的差异
AVR每8个引脚为一组,通过两个寄存器控制其输出输入特性
其中DDRx为方向寄存器,PORTx为端口特性寄存器,即:
//DDRx定义数据方向,即输入或输出;对应位为 0:输入;1:输出
//PORTx为将内部上拉电阻的状态,对应位为 0:无拉;1:上拉
//通过另一个寄存器PINx可以读取外部引脚的状态.
//以下是三者对应关系: (假设DDRx.n,PORTx.n如下,PINx.n悬空)
//DDRx.n PORTx.n PINx.n(悬空时的读值)
// 0 0 x : 输入, 高阻态, PINx.n的值不确定. 对应浮空输入或模拟输入
// 0 1 1 : 输入, 上拉, 值为1. 对应上拉输入(比如按键输入等)
// 1 0 0 : 输出0, 非上拉 对应开漏(或推挽?)输出,强接地
// 1 1 1 : 输出1, 上拉. 对应推挽输出H,强接VCC
寄存器都是8位,可以同时对8个引脚进行操作。
三个寄存器的助记符分别为(以PORTA为例):DDRA、PORTA、PINA,再以PA3(实际PA3=3方便对具体位进行操作)
可见,端口的操作是比较快捷方便的,以输出为例,只须两步每步各设置一个BIT就可以完成配置和输出
1、完成配置,即设置DDRx.n为1,即配置为输出
2、完成端口输出,即设置PORTx.n,为0即强拉到地,为1则上拉到VCC
TT的软件设计在端口的操作上也是根据AVR的上述特性,控制得比较高效的。
ADC 选择PC0 PC1 PC2
低电阻端口选择PB0 PB2 PB4
高电阻端口选择PB1 PB3 PB5
以6个电阻端口来看,选择是B组6个连续的引脚
先通过以下宏定义为引脚名赋值
#define PIN_RL1 PB0 //电阻端口的引脚读值
#define PIN_RL2 PB2
#define PIN_RL3 PB4
#define PIN_RH1 PB1
#define PIN_RH2 PB3
#define PIN_RH3 PB5
然后定义一张引脚掩码表得到对应端口的掩码:
const u8 PinRLtab[] = {(1<< PIN_RL1),(1<< PIN_RL2),(1<< PIN_RL3)};
const u8 PinRHtab[] = {(1<< PIN_RH1),(1<< PIN_RH2),(1<< PIN_RH3)};
即
PinRLtab[3] = {1,4,16}; PinRHtab[3] = {2,8,32};
探头定义为:
#define TP1 PC0 //即探头号定义为0、1、2
#define TP2 PC1
#define TP3 PC2
这样,就可以很方便检索,不同探头所连的不同电阻的端口的掩码
如TP2所连的低阻端口为PinRLtab[TP2]即PinRLtab[1]=4=0B00000100
如果想将TP2、TP3所连的两个低阻同时接地,
则可以将两个掩码相或,即PinRLtab[1]|PinRLtab[2]=0B00010100
正好可用于对这个两个端口同时进行配置:
DDR_RL=PinRLtab[1]|PinRLtab[2]
PORT_RL=PinRLtab[1]|PinRLtab[2]
使得代码非常简洁优美。 |
|