初学STM32,遇到一点问题。
环境:STM32F407ZGT6;DAP-Link下载调试;Keil v5.38;ARMCC v5.06;使用HAL库编程;使用STM32CubeMX生成初始化代码
问题描述:
今天尝试点灯,发现芯片在只有初始化代码的情况下会自己输出高电平(就是什么都没写只有初始化代码,灯就亮了)。
后经查发现在STM32CubeMX中将默认电平(GPIO_output_level)设为high会默认输出低电平(灯不亮),设为low会默认输出高电平(灯亮)。后面再调用HAL_GPIO_WritePin()的时候发现,PinState是RESET的时候会输出高电平,是SET的时候会输出低电平,和网上的描述完全相反
而STM32CubeMX生成的初始化代码就是因为调用了HAL_GPIO_WritePin(),输出了不合预期的高电平
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, GPIO_PIN_RESET); //实际输出了高电平
查阅HAL_GPIO_WritePin()的定义可知,该函数通过向指定GPIO组的BSRR寄存器写数据进行电平控制,向高16位写1则将对应位GPIO设为低电平,向低16位写数据则将对应位GPIO设为高电平。调试未发现有不符合语句逻辑的运行情况。
但是在HAL_GPIO_WritePin()向BSRR低16位对应位写入1之后,对应引脚输出了低电平;向高16位对应位写入1之后,对应引脚输出了高电平,不符合预期。(其通过将原来数据左移16位,从低16位移到高16位再写入BSRR寄存器,来实现向高16位写入1的目的)。
HAL_GPIO_WritePin()的定义如下:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
assert_param(IS_GPIO_PIN_ACTION(PinState));
if(PinState != GPIO_PIN_RESET)
{
GPIOx->BSRR = GPIO_Pin;
}
else
{
GPIOx->BSRR = (uint32_t)GPIO_Pin << 16U; //左移16位再写入BSRR寄存器
}
}
PinState定义如下:
typedef enum
{
GPIO_PIN_RESET = 0,
GPIO_PIN_SET
}GPIO_PinState;
请问各位知道问题出在哪里吗?
第一次发提问,初学STM32,如果有非常低级的错误,望各位指正,谢谢各位。
首先确认下原理图中,LED灯是低电平点亮还是高电平点亮!
不知道你这个问题是否已经解决, 如果还没有解决的话:我是初学STM32的,最近在使用STM32CubeMX生成初始化代码时遇到了一个问题。在只有初始化代码的情况下,芯片会自动输出高电平(灯会亮)。但是在调用HAL_GPIO_WritePin()函数并将PinState设置为RESET时,却输出高电平;将PinState设置为SET时,却输出低电平,与我在网上看到的描述相反。我想知道问题出在哪里。
该问题的背景信息和详细描述是非常重要的,以便更好地理解你所遇到的问题。
请说明你所使用的工具、环境和进行的编程操作,以便更好地分析问题。
如果可能的话,请提供HAL_GPIO_WritePin()函数和PinState的定义,以便更好地理解问题。