问题描述
项目是在F469用emwin搭建的界面,使用Hal库编写,写完一个功能之后,运行测试时,发现界面卡死,进入HardFault_Handler异常。debug之后,发现是由Hal库操作寄存寄存器的代码引起的:
#define DS28EIO_IN() {GPIOC->MODER&=(0<<(1*2));GPIOC->MODER|=(0<<(1*2));} /
#define DS28EIO_OUT() {GPIOC->MODER&=(0<<(1*2));GPIOC->MODER|=(1<<(1*2));}
解决方案:
使用按位取反符号来对寄存器对应引脚赋值:
#define DS28EIO_IN() {GPIOC->MODER&=~(3<<(1*2));GPIOC->MODER|=(0<<(1*2));}
#define DS28EIO_OUT() {GPIOC->MODER&=~(3<<(1*2));GPIOC->MODER|=(1<<(1*2));}
补充内容(Hal库操作寄存器方法):
在 GPIO 端口中,每个引脚都有特定的模式,例如输入模式、通用输出模式、复用功能模式或模拟模式。MODER
寄存器是一个 32 位的寄存器,每个引脚对应一个或多个位,其中每个位对应引脚的模式设置。引脚模式的设置值如下:
- 00:输入模式(复位状态)
- 01:通用输出模式
- 10:复用功能模式
- 11:模拟模式
对应Pin0-Pin15管脚正好有16个,所以32位的寄存器就可以设置每个管脚对应的输入或者输出状态,在Hal库编程中使用寄存器操作,会使CPU运行更加高效。