Emwin卡死进入HardFault_Handler,寄存器操作错误原因

在基于F469的项目中,使用emwin界面并采用HAL库编程时遇到界面卡死问题,原因是GPIOC的MODER寄存器操作不当。通过调试发现错误在于设置引脚模式的宏定义。为修复问题,采用了按位取反符号正确地切换GPIO引脚的输入/输出模式,从而避免了HardFault_Handler异常。文章还介绍了GPIO的MODER寄存器工作原理和模式设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 问题描述

        项目是在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运行更加高效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值