正在传递硬件寄存器指针
Passing hardware register pointer
我正在摆弄xMega AVR微控制器,在将硬件寄存器作为指针传递时遇到了问题。很确定这是指针魔术,但在漫长的一天后,我不明白出了什么问题。
PORTA
(在GCC-AVR工具链中)定义如下:
#define PORTA (*(PORT_t *) 0x0600)
这项工作:
int main(void)
{
// This will set GPIO high
PORTA.DIRSET = 1 << 1;
PORTA.OUTSET = 1 << 1;
while(1) {};
}
这是行不通的:
void gpio_output_set(PORT_t * port, unsigned char pin)
{
// This will *NOT* set GPIO high
port->DIRSET = 1 << pin;
port->OUTSET = 1 << pin;
}
int main(void)
{
gpio_output_set(&PORTA, 1);
while(1) {};
}
为什么?
我认为它应该可以工作。
本质上它与相同
PORT_t* pPort = &*(PORT_t*)0x0600;
pPort->DIRSET = 0x01;
那么,为什么这会成为一个问题呢?Atmel软件框架库也使用这个:
void PORT_ConfigureInterrupt0(PORT_t* port, PORT_INT0LVL_t intLevel, uint8_t pinMask);
PORT_ConfigureInterrupt0(&PORTC, PORT_INT0LVL_MED_gc, 0x01);
您可能应该有
#define PORTA ((PORT_t *) 0x0600)
(铸造前没有初始*
!)
然后用之类的东西替换set
线路
gpio_output_set(PORTA, (unsigned char)10);
相关文章:
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- Atmel Studio:返回一个包含数组的寄存器
- 使用 googletest 测试嵌入式C++代码时处理外设寄存器的重复符号
- 移位寄存器74HC595输出电流
- 超过255的Modbus寄存器无法访问SimpleModbus
- 如何在程序集函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针
- 指向寄存器地址的指针
- 指向寄存器变量的指针
- 用指针AVR端口屏蔽寄存器
- 正在传递硬件寄存器指针